题目描述:给定一个数,输入这个数的阶乘,n的范围为0~9999
直接算肯定不行,模拟乘法的话可以试试,但是还有一种更方便的办法
就是用万进制。
既然是万进制,那么就要有一万个符号来表示一个位的大小,一位字符表示一个符号显然是不够用的,因此用字符串表示符号(但是在存储的时候还是用数字),0000表示0,0001表示1…9999表示9999,与数字相比只是0的个数不同。使用万进制算这题的阶乘有个好处就是较小的乘数只有一位(因为小于一万),那么在模拟乘法的时候就比较方便了。
举个例子:将100101100转化为万进制,最低位是1100,次低位为0010,最高位为0001
不过这种改变进制的方法只适用于其中一个乘数比较小,另一个很大的情况。
其次在输出万进制数时除第一位以外,其余位如果小于1000,要在前面补0
#include<bits/stdc++.h>
using namespace std;
void solve(int n)
{
int maxn=10005;
int ret[maxn+1];
int left=maxn;//表示最高位位置
int carry;//表示进位
memset(ret,0,sizeof(ret));
ret[maxn]=1;//ret数组的最右端存放最低位
for(int i=2;i<=n;i++)
{
carry=0;
for(int j=maxn;j>=left;j--)
{
ret[j]=ret[j]*i+carry;
carry=ret[j]/10000;
ret[j]%=10000;
}
if(carry)//如果一轮乘完最高位进位了,就将left左移一位
ret[--left]=carry;
}
cout<<ret[left];
for(int i=left+1;i<=maxn;i++)
{
//输出时不足四位在前面要补0
if(ret[i]>=1000) cout<<ret[i];
else if(ret[i]>=100) cout<<"0"<<ret[i];
else if(ret[i]>=10) cout<<"00"<<ret[i];
else cout<<"000"<<ret[i];
}
cout<<endl;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int n;
while (cin>>n)
{
solve(n);
}
return 0;
}