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

求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;
}



你可能感兴趣的:(HDU1042 N! 高精度:计算n!精确值)