我正在做一些练习。有一个问题,你需要做前N个自然数的平方和(我们称之为x)和前N个自然数之和的平方(我们称之为y)。最后你想要的是差异y-x。
我做了以下事情:
unsigned long long sumsquar(int limit){
unsigned long long sum = 0;
for(int i=1; i<limit+1; i++){
sum += (i*i);
}
return sum;
}
unsigned long long squarsum(int limit){
unsigned long long sum=0;
for(int i=1; i<limit+1; i++){
sum+=i;
}
return (sum*sum);
}
int main(void)
{
int limit = 1024;
unsigned long long sum1 = squarsum(limit);
unsigned long long sum2 = sumsquar(limit);
unsigned long long erg1 = squarsum(limit)-sumsquar(limit);
printf("%llu\n", erg1);
unsigned long long sum = (limit*(limit+1))/2;
unsigned long long sum_sq = ((2*limit+1)*(limit+1)*limit)/6;
unsigned long long erg2 = (sum*sum)-sum_sq;
printf("%llu\n", erg2);
return 0;
}
简短说明:我有两个函数sumsquar和squarsum,它们计算x和y。
出于比较原因,我还包括上面的4行&#34;返回0&#34;,因为这个解决方案要快得多。
现在的问题是,对于Ns(此处为限制)到1023,我得到相同的结果,但如果限制是> 1023,则结果不一样。 为什么会这样?
BTW对于丑陋的头衔感到抱歉,但我不知道在那里使用什么......
答案 0 :(得分:1)
Int的大小为4byte(int的大小实际上取决于编译器。当天,当处理器为16位时,int为2字节),考虑到你有32位或64位系统。所以最大值限制为0x7fffffff。
无符号长整数至少为64位或更大。
在你的情况下,当N&gt;时,int不足以保持sumsqare()。 303 - 如果你对N使用int> 303,那么你的结果将是不正确的。 如果你使用64位,你可以得到更高的N值。(仍然会有一个限制)
答案 1 :(得分:0)
所以评论中的某些人建议将所有内容更改为unsigned long long。这解决了问题,但我不知道为什么。
编辑: “因为你有64位,无符号;但int通常是32位签名” - Basile Starynkevitch
我测试了它。如果你有:
int aa = 2147483647;
long bb = aa +1;
printf("%d", aa);
printf("%ld", bb);
AA = 2147483647
BB = -2147483648
我的错误是我认为如果这种情况下的变量例如“sum”是无符号长的长度则没有问题,因为它足够大