如何在C中编写适当的算法,确定程序可以使用unsigned long long int
计算因子的最大值?
我的示例无效。使用Linux / 64bit和GCC,它给了我65次迭代。
#include <stdio.h>
int main() {
unsigned long long int num, i;
unsigned long long int factorial = 1;
num = 1;
for (i = 1; i <= num; i++) {
factorial = factorial * i;
num++;
if (factorial <= 0) {
printf("\nMaximum number is: %d\n", i - 1);
break;
}
}
}
答案 0 :(得分:5)
您的程序无法正常运行,因为:
factorial
始终为>= 0
,因为它具有无符号类型。一旦你将足够的时间乘以2或2的倍数,程序停止的唯一原因是factorial
最终变为0
。更可靠的方法是在执行乘法之前检查溢出:
#include <limits.h>
#include <stdio.h>
int main(void) {
unsigned long long int i, factorial;
for (i = factorial = 1; factorial <= ULLONG_MAX / i; i++) {
factorial = factorial * i;
}
printf("\nMaximum number is: %llu! = %llu\n", i - 1, factorial);
return 0;
}
输出:
Maximum number is: 20! = 2432902008176640000