为什么我的 C 程序用于查找最多 21 的阶乘,从 13 的阶乘开始产生无效结果

  • 本文关键字:阶乘 开始 结果 无效 程序 查找 用于 c
  • 更新时间 :
  • 英文 :


在计算 13 阶乘的迭代中,它开始产生无效的结果。我已经完全按照我的教科书中写的方式输入了它,但我得到的输出与书中列出的输出不同。我的编译器是 Dev C++ 并设置为C99标准。编译器中是否有一些设置处于关闭状态,会导致无符号长整形整数格式不正确或没有适当的最大值?13岁!它打印1932053504。

#include <stdio.h>
//prototype for factorial function
unsigned long long int factorial(unsigned int number);
int main(void){
    unsigned int i; //counter for for-loop
    //during each iteration call factorial and print result
    for( i = 0; i <= 21; ++i){
        printf("%u! = %11un", i, factorial(i));
    }
}
unsigned long long int factorial(unsigned int number){
    if(number <= 1){
        return 1;
    }
else{ //recursive step
    return(number * factorial(number - 1));
    }
}

我认为您的说明符中有错别字。我想你的意思是ll不是11.您正在向它传递unsigned long long,因此它需要

printf("%u! = %llun", i, factorial(i));

这是打开(并注意)编译器警告的另一个原因。我的编译器立即告诉我问题是什么。

test.c:11:35: warning: format specifies type 'unsigned int' but the argument has type 'unsigned long long' [-Wformat]
        printf("%u! = %11un", i, factorial(i));
                      ~~~~        ^~~~~~~~~~~~
                      %11llu
1 warning generated.

你得到的答案是未定义行为的结果,但你的机器是小端序,有 32 位整数,13 位!= 6227020800> 2^32 = 4294967296 并且 6227020800% 4294967296 = 1932053504可能是你得到这个答案的原因。

最新更新