c - 一定限度后结果不同

标签 c

我正在做一些练习。有一个问题,你必须计算前 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/

相关文章:

c - 通过 argv 操作进程名称和参数

c - 如何识别我的 Alphacode 实现中的错误?

c - 如何找到默认信号处理函数的源代码?

c - 在C中的函数调用之间保存一个值

将 C 可执行文件转换为 SIS 格式

c - 包含指针变量的 C 程序输出

无法分配链接描述文件中定义的变量的地址

c - unlinkat() C 中的目录

c - 是否可以使用指针和一条语句来分配整个结构

c - 使用 gcc 编译 win32 项目时如何链接到库?