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;
//高精度问题 :大数乘法的应用
//核心思想就是把计算结果每一位上的数字保存到一个数组成员中,例如:
//把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;
}