计算n!

试精确计算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); 
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值