大数阶乘

题目描述:

输入N(0<=N<=1000),输出N的阶乘。

开始使用大数加法完成,当然超时了:

#include <cstdio>
#include <math.h>
#include <cstring>
#include <algorithm>

int res[1001][1000] = {0};
int num[1001];

//大数加法 Num + Res = res
// 计算 res[a] + res[a+1] = rea[a+1]
void BigNumAdd(int a)
{
    int k=0;
    for(int i=0; i<num[a]; i++){
        int temp = res[a][i] + res[a+1][i];
        if(temp >= 10){
            res[a+1][i] = temp%10;
            int k = i+1;
            while(true){
                if(res[a+1][k] == 9)res[a+1][k] = 0;
                else{
                    res[a+1][k] += 1;
                    break;
                }
                k++;
            }
            //res最高位进位
            if(k >= num[a+1]){
                    num[a+1] = k+1;
            }
        }
        else{
            res[a+1][i] = temp;
        }
    }
}


void caculate(int nowN, int N)
{
    for(int i=nowN+1; i<=N; i++){
        num[i] = num[i-1];
        for(int j=1; j<=i; j++){
            BigNumAdd(i-1);
        }
    }
}

int main()
{
    res[0][0] = 0;
    res[1][0] = 1;
    res[2][0] = 2;
    num[0] = 1;
    num[1] = 1;
    num[2] = 1;
    int N;
    //目前计算到的最大整数
    int maxN = 2;
    while(~scanf("%d",&N)){
        if(N <= maxN){
            for(int i=num[N]-1; i>=0; i--){
                printf("%d",res[N][i]);
            }
            printf("\n");
            continue;
        }
        caculate(maxN, N);
        for(int i=num[N]-1; i>=0; i--){
            printf("%d",res[N][i]);
        }
        printf("\n");
        maxN = N;
    }
    return 0;
}

然后使用乘法来做,具体思路:把结果存于数组中,计算n+1的阶乘时,将res(n)数组中的每一位乘n+1,然后继续存储在数组中。

#include <cstdio>
#include <math.h>
#include <cstring>
#include <algorithm>

//存储结果
int a[20001];

int main()
{
    int n;
    //tNum 结果的位数
    int tNum;
    while(~scanf("%d",&n)){
        a[0]=1;
        tNum=1;
        //开始阶乘
        for(int i=2; i<=n; i++)
        {
            int num = 0;
            //将每一位都乘i
            for(int j=0; j<tNum; j++)
            {
                int temp = a[j] * i + num;
                a[j] = temp % 10;
                num = temp / 10;
            }
            //循环将num剩下的值
            while(num)
            {
                a[tNum] = num % 10;
                num = num / 10;
                tNum++;
            }
        }
        //倒序输出
        for(int i=tNum-1; i>=0; i--)
            printf("%d",a[i]);
        printf("\n");
    }

    return 0;
}

 

posted @ 2018-06-01 23:06  Not-Bad  阅读(337)  评论(0编辑  收藏  举报