用数组求大数阶乘问题:
思路:用数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位的数值后存回前一位的数组中,再将余数存回原来位数的数组中。(如不甚明白,看具体实例)
实例:求5的阶乘。
i=2时,a[0]=2. 此时
数组中表现形式:0 0 0 2
i=3时,a[0]=6. 此时
数组中表现形式:0 0 0 6
i=4时,a[0]=24,此时24>10,a[0]=24%10=4,a[1]=24/10=2. 此时
数组中表现形式:0 0 2 4
i=5时,a[0]=120,此时120>10,a[0]=120%10=0,a[1]=120/10=12,此时12>10,a[1]=12%10=2,a[2]=12/10=1. 此时
数组中表现形式:0 1 2 0
代码如下:
#include <stdio.h>
int main()
{
int a[10001];
int d; //位数
int i,j,r,k;
int N;
for(i=1;i<10000+1;i++)
a[i]=0;
a[0]=1;
a[1]=1;
d=1;
scanf("%d",&N);
for(i=1;i<N+1;i++)
{
for(j=1;j<d+1;j++)
a[j]*=i;
for(j=1;j<d+1;j++)
{
if(a[j]>10)
{
for(r=1;r<d+1;r++)
{
if(a[d]>9)
d++;
a[r+1]+=a[r]/10;
a[r]=a[r]%10;
}
}
}
}
for(k=d;k>0;k--)
printf("%d",a[k]);
return 0;
}
另外还有一种方法:
思路:用数组来存放阶乘的每一位数字,首先令a[0]=1(除a[0]之外其他数组元素赋值为0),按照最基本的乘法运算思想来考虑,将临时结果的一项乘以阶乘元素(加上进位),具体文字在代码中说明。
代码如下:
#include<stdio.h>
#include<string.h>
#define MAX 20000
int main()
{
int n,i,a[MAX],c,s,j;
scanf("%d",&n);
memset(a,0,sizeof(a));
a[0]=1;
for(i=2;i<=n;i++) //从2开始求阶乘
{
c=0;
for(j=0;j<MAX;j++)//处理数组中元素,使其每个数据元素为一位数字
{
s=a[j]*i+c; //相应阶乘中的一项与当前所得临时结果的某
//位相乘(加上进位)
a[j]=s%10; //更新临时结果
c=s/10; //是否进位
}
}
for(j=MAX-1;j>=0;j--) //判断所得最终结果在数组中的临界
{
if(a[j])
break;
}
for(i=j;i>=0;i--)
{
printf("%d",a[i]);
}
printf("\n");
return 0;
}