zoukankan      html  css  js  c++  java
  • 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 1010,来进位 
    
    #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("
    ");
        }
    }
  • 相关阅读:
    [JLOI2010] 冠军调查
    [ZJOI2009] 狼和羊的故事
    [CF1451D] Circle Game
    [CF1451E1] Bitwise Queries (Easy Version)
    [CF343D] Water Tree
    [CF1344B] Monopole Magnets
    [CF191C] Fools and Roads
    [CF1370D] Odd-Even Subsequence
    [CF1366D] Two Divisors
    [CF1359D] Yet Another Yet Another Task
  • 原文地址:https://www.cnblogs.com/biggan/p/7457045.html
Copyright © 2011-2022 走看看