【发布时间】:2013-08-20 15:03:25
【问题描述】:
一个非负整数 N 的阶乘,用 N! 表示,是所有小于和等于 N 的正整数的乘积。任何数的阶乘都可以用其素因数的最简单形式表示。例如4!=4*3*2*1= (2^3)*(3^1) 阶乘也可以用每个素因数出现的次数来指定,因此24可以指定为(3 1)的意思3个二,1个三。 我编写的代码给出了小数字的答案,但是当数字变大时,程序不会返回答案
#include<stdio.h>
long fact(long n)
{
if(n==0)
return 1;
else
return(n*fact(n-1));
}
int main()
{
long a[10]={0};
long n,l=0,count=0,i,j,flag;
if(!scanf("%ld",&n))
{
printf("Invalid input");
goto l1;
}
if(n<0)
{
printf("Invalid input");
goto l1;
}
n=fact(n);
while(n%2==0)
{
count++;
n=n/2;
}
a[l]=count;
l++;
for(i=2;i<=n;i++)
{
count=0;
j=2;
flag=0;
while(j<i)
{
if(i%j==0)
{
flag=0;
break;
}
else
flag=1;
j++;
}
if(flag==1)
{
count=0;
while(n%i==0)
{
count++;
n=n/i;
}
a[l]=count;
l++;
}
}
for(i=0;i<l;i++)
printf("%ld ",a[i]);
l1:return 0;
}
【问题讨论】:
-
那是因为您使用递归解决方案来计算阶乘,这使得调用堆栈不断增长,直到它用完非常大的数字的调用堆栈。尝试使用迭代版本来计算而不是递归形式。示例: unsigned int iter_factorial(int n) { int f = 1;诠释我; for(i = 1; i
-
感谢您的回复。但我也尝试过不使用递归,但同样的问题仍然存在
-
您可能会导致 long 类型的溢出:100!=9.332622e+157 unsigned long 的最大值:2^64-1 您可能会使用浮点数获得近似值...
-
递归调用不是问题。整数溢出是问题所在。
标签: c time-complexity