【问题标题】:Problem to return and printf unsigned long返回和 printf unsigned long 的问题
【发布时间】:2021-09-17 09:51:54
【问题描述】:

我不明白为什么我的代码仍在打印 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));
}

这是一个返回阶乘值的非常基本的代码,但我只是一个初学者。

【问题讨论】:

  • 您能否提供说明问题的输入(和相应的输出)示例?
  • 请说明您的输入是什么,您期望什么输出以及您实际得到什么。
  • 您已声明 factorial 以返回 unsigned long,但该函数和 main 中的所有其他内容都在 int 中处理。
  • 如果你机器上的long是32位的,你用有符号还是无符号都没有区别;你仍然会溢出。 12!需要 29 位,可以使用有符号或无符号 32 位类型。 13!需要 33 位,因此通常需要 64 位类型,可能是 long long
  • 编辑问题以提供minimal reproducible example,包括程序失败的输入、观察到的输出,以及预期的输出(或至少将其与观察到的输出区分开来的描述) .此示例可能会阐明您的程序是否失败,是因为 unsigned long 在您的 C 实现中只有 32 位,还是因为您的输入产生的阶乘对于 64 位数字来说太大了。

标签: c function integer printf long-integer


【解决方案1】:

阶乘函数增长非常快。几乎无论您使用什么类型进行计算,它都会很快溢出。

在类型unsigned long 具有32 位(这是保证的全部)的机器上,您的程序可以正确计算12! = 479001600(但没有更大)。我怀疑这就是你所看到的。

unsigned long 类型为 64 位的机器上,您的程序可以正确计算 20! = 2432902008176640000。(我的机器有 64 位长,我用你的程序计算了这个结果,结果很好。)

所以你的程序其实没问题;我看不出有什么问题。 (嗯,有一个未使用的变量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! has 8530 bits

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-27
    • 2014-11-03
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2011-04-08
    • 2010-09-05
    相关资源
    最近更新 更多