算法描述
n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
算法思想
1.首先要搞懂怎样用数组来表示位数。举个例子1*2*3*4*5=120,主要就是(2*3)*4=24,24*5=120这两个位置,让a[0]=0,a[1]表示2,让a[2]=1。首先解决24的问题,4*6=24,通过%10算数得到a[0]=4,然后还剩十位数为2,这个数通过/10=2=a[1];24*5=120,可以分开算得,(a[0]=4) a[0]*5=20,得到a[0]=20%10=0,剩十位数为2,(a[1]=2)2*5=10+剩余的2=12,然后通过对该数%10=2=a[1], 12/10=2=a[2],然后输出数组即为120。 又例如: 1*2*3*4*5*6=720, a[0]=0*6=0,a[1]=2*6=12%10=2,剩十位数为1的,1*6=6+剩余的1=7=a[3],即720,等等。
代码实现#include <stdio.h>
void Factorial(int n,int a[])
{
int i,j;
int c,max=1,temp,carry;
a[0]=1;
for(i=2;i<=n;i++)
{
for(j=0,carry=0;j<max;j++)
{
temp=a[j]*i+carry;
a[j]=temp%10;
carry=temp/10;
//能否进位,若进位则下一个数加上这次的数(循环不结束)
//若结束则有两种可能,结果还没结束,则通过while(carry)执行
}
while(carry!=0)
{
a[max++]=carry%10;
carry=carry/10;
}
}
for(j=max-1;j>=0;j--)
{
printf("%d",a[j]);
}
}
int main()
{
int n;
int a[65536];
scanf("%d",&n);
Factorial(n,a);
return 0;
}