在C语言中求阶乘的整数值

5

最近我在进行C语言的一个家庭作业项目。我们被要求编写代码,以返回您输入数字的阶乘。这很酷也很简单,但是我们还被要求编写一些东西,如果阶乘的数值大于整数的最大值,则会给您写出错误。

int main() {
int a, i;
int faktorial = 1;
a = 10;


if (a < 0)
    printf("Chyba, faktorial z nekladneho cisla neexistuje. \n");
else {
    for (i = 1; i <= a; ++i) {
        faktorial *= i;
    }
    printf("Faktorial z %d = %d\n", a, faktorial);

}

return 0;

这是我的代码,如果阶乘的值大于int类型的值,代码就无法正常工作。我尝试使用if语句,例如:if (阶乘 > 2147483647) 就输出错误信息,但是它并没有起到作用,阶乘仍然等于0。


4
在执行乘法之前,您可以进行检查,例如 if(INT_MAX / i < faktorial) {/* 将会溢出 */}。请注意,本句中的“faktorial”为未翻译的变量名,保持原样即可。 - Weather Vane
2
请记住,在 C 语言中,整数溢出会产生未定义的行为,因此您需要设计您的代码,以便在执行每个操作之前检查是否会发生溢出。先计算再尝试检查是否溢出是行不通的。 - Nate Eldredge
32位整数可以存储高达12!的阶乘。64位整数可以存储高达20!的阶乘。128位(无符号)整数可以存储高达34!的阶乘。256位整数可以存储高达57!的阶乘。512位(无符号)整数可以存储高达98!的阶乘。你可能没有一个能处理大于64位整数大小的编译器(尽管GCC对128位整数有基本支持)。 - Jonathan Leffler
1个回答

6

如果要测试阶乘是否大于INT_MAX,不能使用>运算符,因为一个int永远不会大于INT_MAX。相反,您可以在运算之前将INT_MAX除以a,并检查faktorial是否超过该值。这样做是为了避免在每次迭代中进行除法运算:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
/* ... */
    int bound = INT_MAX / a;
    for (i = 1; i <= a; ++i) {
        if(faktorial > bound)
        {
            fputs("Integer Overflow!\n", stderr);
            return EXIT_FAILURE;
        }
        faktorial *= i;
    }

假设 a 是严格正数,这将总是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接