大数阶乘算法思想

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/04 06:15:31
大数阶乘算法思想

大数阶乘算法思想
大数阶乘算法思想

大数阶乘算法思想
我的初步想法是:取对数,将乘法转化为加法……这个应该可以稍微快些吧.

首先,明确一个问题,一个大数的阶乘,不管用什么都是无法存储得下的,所以必须用数组一位一位的存储,接下来举个例子来说明一下,比如5!
首先算2!则a[0]=2,3!=3*2!,则a[0]=6,4=4*3!,则a[0]=24,进一步使a[1]=2,a[0]=4,5!=5*4!,a[0]=20,
a[1]=10,进一步是a[0]=0,a[1]=10+2=12,再使a[1]=2,a[2]=...

全部展开

首先,明确一个问题,一个大数的阶乘,不管用什么都是无法存储得下的,所以必须用数组一位一位的存储,接下来举个例子来说明一下,比如5!
首先算2!则a[0]=2,3!=3*2!,则a[0]=6,4=4*3!,则a[0]=24,进一步使a[1]=2,a[0]=4,5!=5*4!,a[0]=20,
a[1]=10,进一步是a[0]=0,a[1]=10+2=12,再使a[1]=2,a[2]=1,输出时则按a[2],a[1]a[0]的顺序输出,即120.具体程序如下:
#include
#include
int main()
{
int m,temp=0,i,j,k=0,count1=0,count2=0;
cin>>m;
int a[100]={0};
a[0]=1;
for(i=2;i<=m;i++)
{
for(j=0;j<=count1;j++)
{
a[j]=a[j]*i;
}
for(k=0;k<=count1;k++)
{
if(a[k]/10>0)
{
temp=a[k]/10;
a[k]=a[k]%10;
a[k+1]=a[k+1]+temp;
if(k==count1)
count2++;
}
}
count1=count2;
}
for(i=count1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
return 0;
}

收起