当我使用不同的方法来计算以下方法n=n*i
的阶乘值,然后输出我得到负值
#include <stdio.h>
int
foo(int x)
{
for (int i = 1; i < x; i++) {
x = x * i;
printf("%d ", x);
}
return 0;
}
int
main()
{
int x = 4, m;
m = foo(x);
printf(m);
return 0;
}
我得到的输出:
4 8 24 96 480 2880 20160 161280 1451520 14515200 159667200 1916006400 -861720576
Process finished.
我想更新在相同的价值造成一些问题请帮助
3条答案
按热度按时间yc0p9oo01#
对于初学者来说,你的函数不是递归的。:)
在main中调用
printf
不正确。函数
printf
的第一个参数的指针类型为const char * restrict
。对于类型
int
,可以计算阶乘的最大有效数等于12
:假设
sizeof( int )
等于4
。最好使用函数
unsigned long long int
的返回类型。在这种情况下,可以计算阶乘的最大有效数等于20
:同样,函数参数至少应该有无符号整数类型
unsigned int
。将参数声明为有符号整数类型没有意义。并且函数的返回值
0
没有意义。函数应该返回计算的阶乘。此外,您的函数错误地计算了有效值0的阶乘。
0!
等于1
。可以通过以下方式声明和定义函数
如果你想写一个递归函数,那么它可以看起来像下面这样
这是一个演示程序。
程序输出如下所示
如果你愿意,你可以使用上面显示的非递归函数来代替递归函数。
你也可以这样改变函数,它会向用户发出传递给函数的值太大的信号。
也就是说,如果传递的值不在可接受的范围内,则函数返回值
( unsigned long long int )-1
。然后在main中你可以写
voj3qocg2#
这里有几个问题。主要的一个是,你的
for
循环正在改变x
,它用于指示何时停止循环。你需要使用不同的变量来跟踪你的结果。如果不是因为这个事实,你将有一个无限循环,而int
最终会绕回并成为负循环。你的循环使用
i < x
作为停止条件,但是你需要在等式中包含x
,所以它应该是i <= x
。此外,函数返回0,而不是阶乘的结果。
最后,您有:
这不是
printf()
的工作方式,你需要给予它一个格式字符串来告诉它如何打印参数,例如。把所有这些放在一起,你可能有:
给予:
pvcm50d13#
1.在递归实现中,您不在循环中迭代
printf
首先需要格式或者检查它是否溢出