[英]Problem to return and printf unsigned long
我不明白为什么我的代码仍然打印int 值(溢出)而我想要unsigned long值!
有我的代码:
#include <stdio.h>
unsigned long factorial(int num) {
if ((num == 0) || (num == 1 )) {
return 1;
} else if (num < 0) {
return 0;
} else {
return num * factorial(num - 1);
}
}
int main(void) {
int num;
char liste;
printf("Choisir un nombre pour trouver son factoriel : ");
//Translation : "Choose a number to find its factorial" 🥖
scanf("%d", &num);
printf("factoriel de %d : %lu\n", num, factorial(num));
}
这是一个非常基本的返回阶乘值的代码,但我只是一个初学者。
阶乘函数增长非常快。 几乎无论您使用什么类型进行计算,它都会很快溢出。
在unsigned long
类型有 32 位(这是所有保证)的机器上,您的程序可以正确计算 12! = 479001600(但没有更大的)。 我怀疑这就是你所看到的。
在unsigned long
类型为 64 位的机器上,您的程序可以正确计算 20! = 2432902008176640000。(我的机器有 64 位 long,我用你的程序计算了这个结果,结果很好。)
所以你的程序实际上很好; 我看不出有什么问题。 (好吧,评论中有一个未使用的变量liste
和一条liste
的面包。:-))
如果你的编译器和 C 库都支持long long
类型,你可以试试这个来增加你机器上的范围:
#include <stdio.h>
unsigned long long factorial(int num) {
if (num < 0) {
return 0;
} else if (num <= 1 ) {
return num;
} else {
return num * factorial(num - 1);
}
}
int main(void) {
int num;
printf("Choisir un nombre pour trouver son factoriel : ");
scanf("%d", &num);
printf("factoriel de %d : %llu\n", num, factorial(num));
}
但是,同样,这只会让你达到 20!。 (在这个版本中,我还稍微清理了factorial
函数的逻辑。)
如果%llu
不起作用,您可以尝试%Lu
。
一些编译器支持 128 位类型(我认为 gcc 称之为_uint128_t
或类似的东西),理论上这可以让你达到 34! = 295232799039604140847618609643520000000。
但除此之外,您还必须使用“多精度”或“任意精度”库,例如GMP 。 例如,100! 有 525 位,还有1000位! 有 8530 位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.