(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 来检测溢出
我正在解决一些算法测试 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 来检测溢出