(num % 2) 可以得到 0、1 等等?在 C#

(num % 2) can result in 0, 1, and more? in C#

我正在解决一些算法测试 Collatz conjecture

简而言之,

1-1. if the number is even, divide it by 2
1-2. if odd, multiply it by 3 and plus 1
2. repeat the same process 1(1-1 or 1-2), until the number become 1.

例如, 6 变成 1,经过 8 次尝试(6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1)。

在测试中,应该在500次尝试和returns次尝试后结束。 如果失败500次,那么returns -1.

这是我的代码。

using System;

public class Program {

    public int Main(int num) {

        int answer = -1;
        int maxTry = 500;
        int count = 0;

        if (num == 1)
            return count;
        for (count = 0; count < maxTry; count++)
        {
            // 1-1
            if (num % 2 == 0)
            {
                num /= 2;
            }
            // 1-2
            else
            {
                num = num * 3 + 1;
            }

            if (num == 1)
            {
                answer = count + 1;
                break;
            }
        }

        Console.Write(answer);
        return answer;
    }
}

在遇到“626331”之前,它运行良好! 解释一下,626331不可能是500分之一。 但是用我的代码,它 return 488,这意味着它在 488 次尝试时变为 1。 当我重复打印 process repeat 时,它看起来运行良好。

经过各种尝试,发现问题出在除法上。

我改了这个

if (num % 2 == 0)
...
else
...

进入

if (num % 2 == 0)
...
else if (num % 2 == 1)
...

现在每个案例都完美无缺! 但是我对这种情况没有任何线索。

在线编码测试,编译选项为C# Mono C# Compiler 5.14.0.177

你会溢出,一旦溢出,结果将为负,num % 2 可以 return 0 或 -1。 C# 中的 % 运算符是余数运算符,而不是数学模运算符。看 Mod of negative number is melting my brain

您需要使用更宽的整数类型 (long) 并启用 checked mode 来检测溢出