当我使用与以下方法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.
我认为更新相同的值会引起一些问题请帮助
对于初学者来说,您的函数不是递归的。:)
主中printf
的此调用
printf(m);
不正确。函数printf
的第一个参数具有指针类型const char * restrict
。
对于类型int
,可以计算阶乘的最大有效数等于12
:
12! = 479001600
条件是CCD_ 7等于CCD_。
最好使用函数unsigned long long int
的返回类型。在这种情况下,可以计算阶乘的最大有效数等于20
:
20! = 2432902008176640000
此外,函数参数应至少具有无符号整数类型unsigned int
。将参数声明为具有带符号整数类型是没有意义的。
并且函数的返回值CCD_ 12没有意义。函数应返回计算出的阶乘。
此外,函数还错误地计算了有效值0的阶乘。13等于CCD_ 14。
功能可以通过以下方式声明和定义
unsigned long long int foo( unsigned int n )
{
unsigned long long int factorial = 1llu;
while ( n > 1 ) factorial *= n--;
return factorial;
}
如果你想写一个递归函数,那么它可以看起来像
unsigned long long int foo( unsigned int n )
{
return n < 2 ? 1llu : n * foo( n - 1 );
}
这是一个示范节目。
#include <stdio.h>
unsigned long long int foo( unsigned int n )
{
return n < 2 ? 1llu : n * foo( n - 1 );
}
int main( void )
{
const unsigned int MAX_FACTORIAL_VALUE = 20;
for (unsigned int i = 0; i <= MAX_FACTORIAL_VALUE; i++)
{
printf( "%u! = %llun", i, foo( i ) );
}
}
程序输出将看起来像
0! = 1
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! = 6227020800
14! = 87178291200
15! = 1307674368000
16! = 20922789888000
17! = 355687428096000
18! = 6402373705728000
19! = 121645100408832000
20! = 2432902008176640000
如果你愿意,那么你可以使用上面显示的非递归函数来代替递归函数。
您也可以更改函数,使其向用户发出传递给函数的值太大的信号。一个简单的方法是例如以下
unsigned long long int foo( unsigned int n )
{
const unsigned int MAX_VALID_VALUE = 20;
if (MAX_VALID_VALUE < n) return -1;
unsigned long long int factorial = 1llu;
while (n > 1) factorial *= n--;
return factorial;
}
也就是说,如果传递的值不在可接受的范围内,则函数返回值( unsigned long long int )-1
。。
然后你基本上可以写
#include <limits.h>
//...
unsigned long long int m = foo( some_value );
if ( m == ULLONG_MAX ) puts( "Error: too big value." );
这里有一些问题。主要的一个是for
循环正在更改x
,CCD_17用于指示何时停止循环。您需要使用不同的变量来跟踪结果。如果不是因为这个事实,你会有一个无限循环,int
最终会缠绕起来并变成否定的。
循环使用i < x
作为停止条件,但需要在等式中包含x
。所以应该是i <= x
。
此外,函数返回0,而不是阶乘的结果。
最后,你有:
printf(m);
printf()
不是这样工作的,你需要给它一个格式字符串来告诉它如何打印参数,例如
printf("%dn", m);
把所有这些放在一起,你可能会有:
int factorial(int x)
{
int result = 1;
for (int i = 2; i <= x; i++) {
result *= i;
printf("%d ", result);
}
return result;
}
int main()
{
int x = 4, m;
m = factorial(x);
printf("%dn", m);
return 0;
}
给予:
2 6 24 24
- 在递归实现中,不在循环中迭代
printf
首先需要格式
unsigned long long fact(unsigned int x) // as fact of the negative number is not defined
{
if(x) return x * fact(x - 1);
return 1;
}
int main(void)
{
unsigned long long m;
unsigned int x = 5;
m = fact(x);
printf("%llun", m);
return 0;
}
或者检查它是否没有溢出
unsigned long long fact(int x) // as fact of the negative number is not defined
{
if(x)
if(x < 0 || x * (x - !x) < x ) return 0;
else return x * fact(x - 1);
return 1;
}
int main(void)
{
unsigned long long m;
int x = 120;
m = fact(x);
if(m) printf("%llun", m);
else printf("Undefinedn");
return 0;
}