大数的阶乘,主要是用数组来存储(就是把一个数的每个位置上的数用数组保存下来),令外看到了一种万进制的方法,其实和十进制一样,只不过是把数字每四个分开存储进数组,相对比十进制,用到的空间较少。还要注意的是前导零输不输出的问题,如果在最高位,前导零不必输出,其他的需要输出,例如:若,啊a[0]=556,a[1]=774,a[2]=8849,那么输出便是55607748849,而不是5567748849。
十进制代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#include<iomanip>
#define INF 0x3f3f3f3f
using namespace std;
void factorial(int n)
{
int a[100001];//注意这儿,不能开小,否则会wa
a[0]=1;
int pos=0;
int carry=0; //表示进位
for(int i=1;i<=n;i++)
{
for(int j=0;j<=pos;j++)
{
a[j]=a[j]*i+carry;
carry=a[j]/10;
a[j]%=10;
}
while(carry) //进位
{
pos++;
a[pos]=carry%10;
carry/=10;
}
}
for(int i=pos;i>=0;i--) //注意从后往前输出
{
cout<<a[i];
}
cout<<endl;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
factorial(n);
}
}
万进制:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#include<iomanip>
#define INF 0x3f3f3f3f
using namespace std;
void factorial(int n)
{
int a[10001];
a[0]=1;
int pos=0;
int carry=0; //表示进位
for(int i=1;i<=n;i++)
{
for(int j=0;j<=pos;j++)
{
a[j]=a[j]*i+carry;
carry=a[j]/10000;
a[j]%=10000;
}
while(carry) //进位
{
pos++;
a[pos]=carry%10000;
carry/=10000;
}
}
cout<<a[pos];
for(int i=pos-1;i>=0;i--) //注意从后往前输出
{
cout<<setw(4)<<setfill('0')<<a[i];
}
cout<<endl;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
factorial(n);
}
}