题目链接:https://www.nowcoder.net/acm/contest/75/E
题目描述:给定一个整数N(0≤N≤10000),求取N的阶乘
输入描述:多个测试数据,每个测试数据输入一个数N
输出描述:每组用一行输出N的阶乘
输入
1
2
3
输出
1
2
6
思路:刚看到时我以为是打表,但是看到N的最大值后就放弃了这种想法。然后就想到了大数乘法,由于以前只写过大数加,所以比赛时一时没有思路,就选择了放弃,比赛结束补题时才把它A了,接下来是我的代码,希望对各位有所帮助~
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int n; 5 int a[35000],b[35000],num[100]; //为了试数组大小试了很久,最后把范围缩小到了3e5左右 6 7 int main(){ 8 while(~scanf("%d",&n)){ 9 memset(a,0,sizeof(a)); 10 memset(b,0,sizeof(b)); 11 a[0]=1; 12 int flag=1; //用来记录a数组的长度 13 for(int i=1;i<=n-1;i++){ 14 int m=i; 15 for(int j=0;j<flag;j++){ 16 b[j]=a[j]; 17 } 18 int t=0; 19 while(m){ 20 num[t++]=m%10; //将m的每个数用数组存起来 21 m/=10; 22 } 23 int j,k; 24 for(j=0;j<flag;j++){ //用乘法竖式即可理解 25 //实在不能理解,请看我找到的这篇大神的博客(http://blog.csdn.net/lisp1995/article/details/52316466) 26 for(k=0;k<t;k++){ 27 a[j+k]=a[j+k]+num[k]*b[j]; 28 } 29 } 30 flag=j+k; 31 for(j=0;j<flag;j++){ //进位处理 32 if(a[j]>=10){ 33 a[j+1]=a[j+1]+a[j]/10; 34 a[j]=a[j]%10; 35 } 36 } 37 } 38 int i; 39 for(i=flag;i>=0;i--){ //去除前导零 40 if(a[i]!=0) break; 41 } 42 for(;i>=0;i--){ 43 printf("%d",a[i]); 44 } 45 printf(" "); 46 } 47 }