为什么在 C 中找到阶乘时给出负值?
why it gives negative values when finding factorial in C?
- 我必须创建一个递归函数来找到从 1 到 30 的阶乘。
- 12 以内的阶乘值是正确的。从 13 开始,它给出了错误的值,其中一些是负数。
- 我用了"unsigned long long"但是没用。
- 我使用 codeblocks 作为编译器,所以我认为它最多只能处理 32 位整数。
- 这是代码和输出。
#include <stdio.h>
#include <math.h>
unsigned long int factorial_rec(unsigned long n)
{
if(n==1) return 1;
else return factorial_rec(n-1) * n;
}
int main(int argc, char **argv)
{
int i;
for(i=1; i<30; i++)
printf("%d! = \t%d\n", i, factorial_rec(i));
return 0;
}
输出:-
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184
17! = -288522240
18! = -898433024
19! = 109641728
20! = -2102132736
21! = -1195114496
22! = -522715136
23! = 862453760
24! = -775946240
25! = 2076180480
26! = -1853882368
27! = 1484783616
28! = -1375731712
29! = -1241513984
你在这一行中犯了一个愚蠢的错误:
printf("%d! = \t%d\n", i, factorial_rec(i));
对 factorial_rec(i)
使用说明符 %lu
而不是 %d
,您将不会再收到任何错误。
正确的语法:
printf("%d! = \t%lu\n", i, factorial_rec(i));
建议: 更好地使用:unsigned long long
修饰符以获得如此大的值的预期结果,并改用说明符 %llu
。
免责声明:该值可能是意外的,因为较大的数字会溢出。
主要问题是您如何打印结果:
printf("%d! = \t%d\n", i, factorial_rec(i));
%d
格式说明符需要一个 int
参数,但对于第二个参数,您要传递一个 unsigned long
。使用错误的格式说明符调用 undefined behavior.
对于 unsigned long
,您应该使用 %lu
作为格式说明符。但是,不能保证 unsigned long
足够大以容纳 64 位数字。为此,您应该使用 unsigned long long
作为数据类型,并使用 %llu
打印它。
- 我必须创建一个递归函数来找到从 1 到 30 的阶乘。
- 12 以内的阶乘值是正确的。从 13 开始,它给出了错误的值,其中一些是负数。
- 我用了"unsigned long long"但是没用。
- 我使用 codeblocks 作为编译器,所以我认为它最多只能处理 32 位整数。
- 这是代码和输出。
#include <stdio.h>
#include <math.h>
unsigned long int factorial_rec(unsigned long n)
{
if(n==1) return 1;
else return factorial_rec(n-1) * n;
}
int main(int argc, char **argv)
{
int i;
for(i=1; i<30; i++)
printf("%d! = \t%d\n", i, factorial_rec(i));
return 0;
}
输出:-
1! = 1
2! = 2
3! = 6
4! = 24
5! = 120
6! = 720
7! = 5040
8! = 40320
9! = 362880
10! = 3628800
11! = 39916800
12! = 479001600
13! = 1932053504
14! = 1278945280
15! = 2004310016
16! = 2004189184
17! = -288522240
18! = -898433024
19! = 109641728
20! = -2102132736
21! = -1195114496
22! = -522715136
23! = 862453760
24! = -775946240
25! = 2076180480
26! = -1853882368
27! = 1484783616
28! = -1375731712
29! = -1241513984
你在这一行中犯了一个愚蠢的错误:
printf("%d! = \t%d\n", i, factorial_rec(i));
对 factorial_rec(i)
使用说明符 %lu
而不是 %d
,您将不会再收到任何错误。
正确的语法:
printf("%d! = \t%lu\n", i, factorial_rec(i));
建议: 更好地使用:unsigned long long
修饰符以获得如此大的值的预期结果,并改用说明符 %llu
。
免责声明:该值可能是意外的,因为较大的数字会溢出。
主要问题是您如何打印结果:
printf("%d! = \t%d\n", i, factorial_rec(i));
%d
格式说明符需要一个 int
参数,但对于第二个参数,您要传递一个 unsigned long
。使用错误的格式说明符调用 undefined behavior.
对于 unsigned long
,您应该使用 %lu
作为格式说明符。但是,不能保证 unsigned long
足够大以容纳 64 位数字。为此,您应该使用 unsigned long long
作为数据类型,并使用 %llu
打印它。