输入输入后输出控制台冻结

Output Console freeze after entering the input

我一直在尝试编写代码来查找给定数组元素的 LCM。我的代码看起来像这样

public long LcmOfArray(List<int> a)
{
    long LCM = 1;
    bool divisible = false;
    int divisor = 2, count = 0;

    while (count != a.Count)
    {
        for (int i = 0; i < a.Count; i++)
        {
            if (a[i] == 0)
            {
                return 0;
            }
            if (a[i] < 0)
            {
                a[i] *= -1;
            }
            if (a[i] % divisor == 0)
            {
                divisible = true;
                a[i] /= divisor;
            }
            if (a[i] == 1)
            {
                count++;
            }
        }

        if (divisible)
        {
            LCM *= divisor;
        }
        else
        {
            divisor++;
        }
    }
    
    return LCM;
}

我的问题是当我输入时输出控制台冻结。我尝试了另一种没有 while 循环的方法。也就是去掉了while循环,最后加了一个if循环。

if (count == a.Count)
{
    return LCM;
}

但现在编译器抛出一个错误,指出并非所有代码路径 returns 一个值。有人可以帮我解决我的代码中的错误吗?我是编码的初学者。提前致谢!!

while 循环将 运行 不断,直到你给它一些东西来打破循环。在您的情况下,它打破循环的唯一方法似乎是在列表的每个项目都是 1 或达到 0 的情况下,因此根据列表,它可能会或可能不会卡在无限循环。例如,a[i] = 2 似乎创建了一个无限循环。 另一个编译器错误是因为某些条件可能会跳过 return 语句。

if(count==a.Count)
{
   return LCM;
}
return void; // because what if count does not equal a.Count?

您应该将 bool divisible = false;int count = 0; 放在 while 循环中。由于不能将 int count = 0; 置于 while 循环之外,因此应使用 while (true) 而不是 while (count != a.Count) 并将以下 if 语句放在 while 循环的最后。

if (count == a.Count)
{
    return LCM;
}

这里是完整的方法:

public static long LcmOfArray(List<int> a)
{
    long LCM = 1;
    int divisor = 2;

    while (true)
    {
        int count = 0;
        bool divisible = false;
        for (int i = 0; i < a.Count; i++)
        {
            if (a[i] == 0)
            {
                return 0;
            }
            if (a[i] < 0)
            {
                a[i] *= -1;
            }
            if (a[i] == 1)
            {
                count++;
            }
            if (a[i] % divisor == 0)
            {
                divisible = true;
                a[i] /= divisor;
            }
        }
        if (divisible)
        {
            LCM *= divisor;
        }
        else
        {
            divisor++;
        } 
        if (count == a.Count)
        {
            return LCM;
        }
    }
}