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