出现溢出错误,不明白为什么

Getting an overflow error and don't understand why

当我编译下面的代码时,我得到一个错误 "warning: overflow in implicit constant conversion"。当我 运行 编译后的代码时,我得到一个不正确的结果 0。这是为什么,我该如何解决?

#include<stdio.h>
int main(void)
{
  long bigboy = 600851475143;
  int num_of_factors = 0;
  for(int i = 1; i < bigboy; i++)
  {
    if(bigboy % i == 0)
      num_of_factors++;
  }
  printf("%d", num_of_factors); 
  return 0;
}

I get an incorrect result, of 0. Why is this (?)

整数数学不够宽。

需要 2+ 次更改

long够宽吗?

long可能只有32位,那么long bigboy = 600851475143;不足以保存常量。推荐 long long

 long long bigboy = 600851475143;

int i够宽吗?

int i更可能是宽度不够。 int,一般是32位的,可能只有16位的。如果 int 达到最大值,接下来的 i++ 未定义的行为

// for(int i = 1; i < bigboy; i++)
for(long long i = 1; i < bigboy; i++)

int num_of_factors够宽吗?

为什么对整数数学这么吝啬?建议全程使用long long

// /int num_of_factors = 0;
int num_of_factors = 0;

性能提升

与其数到 bigboy,不如算出 bigboy 的平方根如何?

long long num_of_factors = 0;
long long i;
for(i = 1; i < bigboy/i; i++) {
  if(bigboy % i == 0) {
    num_of_factors += 2;  // Count both i and bigboy/i
  }
}

// Look for square root
if (i <= bigboy/i) {
  if(bigboy % i == 0) {
    num_of_factors ++;
  }
}