杭电ACM 1042 N!(还需再看)

                                        N!

Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
 
Input
One N in one line, process to the end of file.
 
Output
For each N, output N! in one line.
 

Sample Input

  
  
1 2 3
 

Sample Output

  
  
1 2 6
 
AC代码:
 //计算 N!的斯特林公式:n!=(sqrt(2*pi*n))(n/e)^n,如果用这个公式计算 N!因为数太大还是不可以用来计算 所以还是要用大数乘法计算
//高精度问题 :大数乘法的应用
//核心思想就是把计算结果每一位上的数字保存到一个数组成员中,例如:
//把124保存到数组中,保存结果应该是result【0】=4,result【1】=2,result【2】=1
//把整个数组看成一个数字,这个数字和一个数相乘的时候,需要每一位都和这个乘数进行相乘运算,还需把前一位的进位加上
//int 结果=result【x】*乘数+进位;
//每一位的计算结果有了,把这个结果的个位数拿来放到这个数组元素上:result【x】=结果%10;
//接下来的工作就是计算出进位:进位=结果/10;

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
 int n,i,j,temp,k,count,a[110000];
 while(scanf("%d",&n)!=EOF)
 { k=0;
  count=1;
  a[0]=1;
 for(i=1;i<=n;i++)
 {
    k=0;
  for(j=0;j<count;j++)
  {
   temp=k+a[j]*i;            
  // if(a[j]>=10)
  // {
    a[j]=temp%10;
    k=temp/10;
  // }
  }
  while(k)                   //计算进位
  {
   a[count++]=k%10;      //count标志着 a 的位数,因为count的 初始值为1,当有进位时便执行加 1 操作,所以上面的 for 循环中j的范围是0—count
   k=k/10;
  }
 }
 for(i=count-1;i>=0;i--)
  printf("%d",a[i]);
 printf("\n");
 }
 return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值