当我编译下面的代码时,出现错误消息“警告:隐式常量转换中的溢出”。当我运行编译后的代码时,得到的结果不正确,为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;
}
答案 0 :(得分:2)
我得到的结果不正确,为0。为什么是这个(?)
整数数学范围不足。
需要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
足够宽吗?
为什么对整数数学会st?建议始终使用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 ++;
}
}