HDOJ 1042 N! (大数阶乘)

Problem Description
Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!
 
Input
One N in one line, process to the end of file.
 
Output
For each N, output N! in one line.
 
Sample Input
1 2 3
 
Sample Output
1 2 6
 
 
SOLU 1.
求大数的阶乘(10000以内) 

要求:
需要知道阶乘结果的位数,直接对每一位乘以整个较大数,
mod 10 ,\ 10,来进位 

#include<iostream>
#include<cstring>
using namespace std;
#define MAX_LEN 40000
int main()
{
    int f[40010];
    int n;
    
    while(cin>>n)
        {
            memset(f,0,sizeof(f));
            f[0]=1;                                  //初始f[0]为1; 
            for(int i=2;i<=n;i++)              
                {
                       int c=0;                         //变量c存储进位,每一次乘法都要令为0; 
                       for(int j=0;j<MAX_LEN;j++)          //每一次乘法都要对存储的每一位计算, 
                       {                                //并且是每一位都是拿整个大数来乘 
                        int s=f[j]*i+c;
                        f[j]=s%10;                   //取余 
                        c=s/10;                      //进位 
                    }                                //不用处理最高进位 
                }
            int i=MAX_LEN-1;
            while(f[i]==0)                           //前导输出 
            i--;
            for(;i>=0;i--)
                cout<<f[i];
            cout<<endl;
        }
    
    return 0;
} 
 

 

SOLU 2.

#include <stdio.h>
#include <string.h>

/* 一个数组元素表示 4 个十进制位,即数组是万进制的 */
#define BIG_RADIX 10000
#define RADIX_LEN 4
/* 10000! 有 35660 位 */
#define MAX_LEN (35660/RADIX_LEN + 1)

int x[MAX_LEN + 1];

void Big_Print()
{
    int i;
    int start_output = 0;//用于跳过多余的0

    for (i = MAX_LEN; i >= 0; --i)
    {
        if (start_output == 1)
            {//如果多余的0已经跳过,则输出
            printf("%04d", x[i]);
            }
        else if (x[i] > 0)
            {//表示多余的0已经跳过
            printf("%d", x[i]);
            start_output = 1;
            }
    }
    if (start_output == 0)//如果全为0
        printf("0");
}

void Big_Multiple(int y)
{
    int i;
    int carry = 0;//保存进位
    int tmp;

    for (i = 0; i < MAX_LEN; ++i)
    {
        
        tmp = x[i] * y + carry;
        x[i] = tmp % BIG_RADIX;
        carry = tmp / BIG_RADIX;
    }
}

void Big_Factorial(int N)
{
    int i;

    memset(x, 0, sizeof(x));
    x[0] = 1;
    for (i = 2; i <= N; ++i)
    {
        Big_Multiple(i);
    }
}

int main(void){
    int N;

    while (scanf("%d", &N) != EOF)
    {
        Big_Factorial(N);
        Big_Print();
        printf("\n");
    }
}

 

posted on 2017-08-31 10:39  bigganbing  阅读(302)  评论(0编辑  收藏  举报