HDU1042 N! 高精度:计算n!精确值

时间:2022-03-28 13:42:28

求n!的精确值。


可以直接模拟乘法操作,记录每位的值,这种方法耗时比较多。

实现代码如下(1236MS):

//by Ibsen
#include <cstring>
#include <cstdio>
using namespace std;
#define MAX 10000000
int a[MAX];//存数运算结果
int main()
{
int n;
while(scanf("%d",&n)!=-1)
{
memset(a,0,sizeof(a));
int i,j;
int p,add;//p存储当前结果的位数,add为进位
a[1]=1;
p=1;
for(i=2;i<=n;++i) //循环与2,3,4.....n相乘
{
for(j=1,add=0;j<=p;++j) //让a[]的每位与i相乘
{
a[j]=a[j]*i +add;
add= a[j]/10;
a[j]=a[j]%10;
}
while(add>0) //如果h不为0
{
a[j]=add%10;
add=add/10;
++j;
}
p=j-1; //将当前的位数赋给p
}
for(i=p;i>= 2;--i) //a[]数组的前面是低位,后面高位
{
printf("%d",a[i]);
}
printf("%d\n",a[i]);
}
return 0;
}



万进制。

实现代码如下(236MS):

#include <cstdio>
#include <iostream>
#include <iomanip>
#define M 10000
using namespace std;
int main()
{
int n,f[10001],ans,course;
int i,j;
while(cin>>n)
{
f[0]=1;
ans=0;
for(i=1;i<=n;i++)
{
course=0;
for(j=0;j<=ans;j++)
{
f[j]=f[j]*i+course;
course=f[j]/M;
f[j]%=M;
}
if(course)
{
ans++;
f[ans]=course;
}
}
cout<<f[ans];
for(i=ans-1;i>=0;i--)
cout<<setw(4)<<setfill('0')<<f[i];
cout<<endl;
}
return 0;
}