hdu1042 大阶乘

今天,我来学习一下高精度运算来,高精度运算在数学专题是经常要用上的。

N!
因为这里的N<100000,显然要高精度啦。如果N<20的话,倒是可以用long long 来水一发的。
这里的高精度算法使用的是模拟我们手写竖式那样子算来的。
设用数组a[n]用来保存第I个I!(a[0]存个位数字,a[1]存十位,a[2]存百位···,这样做的好处就是便于进位处理),那么我们在计算(I+1)!的时候,因为(I+1)!=I!*(I+1);
我们就可以让I+1分别去乘以I!的各个数位上的值,然后再处理好进行就可以了。
下面是代码:

#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <limits.h>
using namespace std;
#define N 10000000
int a[N];
int main()
{
    int n ,tmp ,k ,count;
    while(scanf("%d",&n)!=EOF)
    {
        tmp =  0 ;
        k =0 ;
        count = 1;//表示I!的现在有多少位了
        memset(a,0,sizeof(a));//初始化
        a[0]=1;//初始化
        for(int i = 1 ; i<=n;i++)
        {
            k = 0 ;//进位数据
            for(int j = 0 ;j<count;j++)
            {
                tmp=a[j]*i+k;//本位乘法等于本位相乘加上来自低位的进位
                a[j]=tmp%10;//本位的结果
                k =tmp/10;//送往高位的进位
            }
            while(k)//进位可能会有没有处理完的进位数据
            {
                a[count++]=k%10;
                k=k/10;
            }
        }
        for(int i = count - 1;i>=0;i--)从最高位开始向低位输出
            printf("%d",a[i]);
        printf("\n");
    }
    return 0 ;
}

你可能感兴趣的:(阶乘-高精度-模拟)