试精确计算n!=1x2x3x4x5......x n,这里的正整数n从键盘输入。
当n规模较大时
1)算法设计要点
模拟整数竖式乘运算实施精确计算。
通过常用对数累加和s=lg2+lg3+......+lgn确定n!的位数m=s+1,即a数组元素的个数。
设置二重循环,模拟整数竖式乘法实施各数组元素的累乘:
乘数k: k=2,3.......n;
累乘积各位a[ j ]:j = 1,2,........m;
实施乘运算:
t=a[ j ]*k+g; //第 j 位乘 k,g为进位数
a[ j ] = t %10; //乘积 t 的个位数字存在于本元素
g = t /10; //乘积 t 的十位以上数字为进位数
输出:从高位a[ m ]开始,逐位输出,至a[ 1 ]结束。
2)算法描述
//计算n!(n<10000)
#include<stdio.h>
#include<math.h>
main()
{
int j,k,m,n,a[40000];
long g,t;
double s;
printf(" 请输入正整数n(n<10000):");
scanf("%d",&n); //输入n
s=0;
for(k=2;k<=n;k++)
s+=log10(k); //对数累加,确定n!的位数m
m=(int)s+1;
for(k=1;k<=m;k++)
a[k]=0; //数组清零
a[1]=1;
g=0;
for(k=2;k<=n;k++)
for(j=1;j<m;j++)
{
t=a[j]*k+g; //数组累乘并进位
a[j] = t%10; //乘积t留在a[j]中的个位数
g = t/10; //乘积t进位的十位数
}
printf("%d!=",n);
for(j=m;j>=1;j--)
printf("%d",a[j]); //输出n!的各位数
printf("\n 共%d位.\n",m);
}