我正在做一些练习。有一个问题,你必须计算前 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 和 squaresum 计算 x 和 y。
出于比较的原因,我还包括了“return 0”上方的 4 行,因为使用此解决方案速度要快得多。
现在的问题是,对于 Ns(此处为限制)为 1023,我得到相同的结果,但如果限制 >1023,则结果不同。 为什么会这样?
顺便说一句,很抱歉这个丑陋的标题,但我不知道在那里用什么......
最佳答案
考虑到您拥有 32 位或 64 位系统,Int 的大小为 4 字节(int 的大小实际上取决于编译器。在过去,当处理器为 16 位时,int 为 2 字节)。所以最大值限制为 0x7fffffff。
其中 unsigned long long 至少为 64 位或更大。
在您的情况下,当 N > 303 时, int 不足以容纳 sumsqare() - 因此,如果您将 int 用于 N>303 ,您的结果将不正确。 如果你使用64位,你可以使用更高的N值。(仍然会有限制)
关于c - 一定限度后结果不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47742125/