试精确计算n! = 1x2x3x4.......xn,这里正整数n从键盘输入。
1)当n规模较大时
算法设计要点:模拟整数竖式乘运算实施精确计算。
通过常用对数累加和s=lg2+lg3+lg4+......+lgn确定n!的位数m=s+1,即a数组元素的个数。
设置2重循环,模拟整数竖式乘法实施各数组元素的累乘:
乘数K:K=2,3,4,.......,m;
实施乘运算:
t = a[ j ] * k + g; //第 j 位乘 k,g位进位数
a[ j ] = t %10; //乘积 t 的个位数字存于本元素
g = t / 10; //乘积 t 的十位以上的数字作为进位数
输出: 从高位a [ m ]开始,逐位输出,至a[ 1 ]结束。
算法描述:
//计算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;
g = t/10;
}
printf(" %a!=",n);
for(j=m;j>=1;j--)
printf("%d",a[j]); //输出n!的各位数
printf("\n 共%d位. \n",m);
}
#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;
g = t/10;
}
printf(" %a!=",n);
for(j=m;j>=1;j--)
printf("%d",a[j]); //输出n!的各位数
printf("\n 共%d位. \n",m);
}