在计算 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可能是你得到这个答案的原因。