这可能是我遇到的最奇怪的事情:一个同时是正面和负面的数字!(我可以向你证明这一点,因为我的输入/输入链接到我的代码在ideaone.基本上,我的输出是一个负数,但更奇怪的是:当我检查它是否小于零时,它是假的(?!).更奇怪的是:当你将它乘以一个以外的数字时,它会切换回打印为正数.
当我在Xcode上编译时,这个错误不会发生,但是在互联网(或其他一些编译器)上编译时会发生这种错误,例如我链接中的编译器.
理解它究竟是什么并不重要,我想知道为什么这个值同时是负面和正面的.
#include <stdio.h>
#include <cmath>
int main()
{
unsigned long answer,T,n,N,a,d,b,L1,amount;
scanf("%ld",&T); // number of test cases to loop through
while (T--) {
scanf("%ld",&N);
amount = 0;
answer = 0;
n=N-N%2;
for (a = 1; a <= n/2; a++) {
d = N-a;
L1 = a*d;
for (b = 1; b*b < L1 ; b++) {
// "amount" is always a positive number
amount = 2*(((L1-1)/b) - b + 1) - 1;
if (d==a) answer+=amount;
else answer+=2*amount; // we are only adding positive values to this
}
}
if (answer<0) printf("This answer is less than zero %ld\n",answer);
if (answer>0) printf("This answer is greater than zero %ld\n",answer);
printf("%ld\n",answer);
printf("%ld\n",2*answer/2);
}
}
Run Code Online (Sandbox Code Playgroud)
输入:
1
2500
输出:
Success time: 0.02 memory: 3300 signal:0
This answer is greater than zero -1842629629
-1842629629
304854019
Run Code Online (Sandbox Code Playgroud)
如你所见,我的否定答案大于零.更不用说,它与我在Xcode中编译时的答案不同,即使是正面形式.
我很惊讶.它打印出一个"正面"的负数
answer是无符号的. %ld在格式字符串中签名很长.更改%ld为%lu,您不会在打印时将未签名的值更改为签名值,并且它将正确打印.
if (answer<0) printf("This answer is less than zero %lu\n",answer);
if (answer>0) printf("This answer is greater than zero %lu\n",answer);
Run Code Online (Sandbox Code Playgroud)