繁体   English   中英

返回问题和 printf unsigned long

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM