某些限制后的不同结果

时间:2017-12-10 18:34:18

标签: 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和squarsum,它们计算x和y。

出于比较原因,我还包括上面的4行&#34;返回0&#34;,因为这个解决方案要快得多。

现在的问题是,对于Ns(此处为限制)到1023,我得到相同的结果,但如果限制是> 1023,则结果不一样。 为什么会这样?

BTW对于丑陋的头衔感到抱歉,但我不知道在那里使用什么......

2 个答案:

答案 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”是无符号长的长度则没有问题,因为它足够大