zoukankan      html  css  js  c++  java
  • 水题记录--大整数求阶乘

    大数阶乘

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:3
     
    描述
    我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
     
    输入
    输入一个整数m(0<m<=5000)
    输出
    输出m的阶乘,并在输出结束之后输入一个换行符
    样例输入
    50
    样例输出
    30414093201713378043612608166064768844377641568960512000000000000


    代码:
    package acm3;
    
    import java.util.Scanner;
    
    public class Main 
    {
        /**
         * 计算进位
         * @param bit    数组
         * @param pos 用于判断是否是数组的最高位
         */
        private void carry(int[] bit, int pos)
        {
            int i ,carray = 0;
            for(i = 0 ; i<= pos ;i++)//从0到pos逐位检查是否需要进位
            {
                bit[i] += carray;//累加进位
                if(bit[i] <= 9)  //小于9不进位
                {
                    carray = 0;
                }
                else if(bit[i] >9 && i<pos)//大于9,但不是最高位
                {
                    carray = bit[i]/10;//保存进位值
                    bit[i] = bit[i]%10;//得到该位的一位数
                }
                else if(bit[i] > 9 && i >= pos)//大于9,且是最高位
                {
                    while(bit[i] > 9)//循环向前进位
                    {
                        carray = bit[i]/10;//计算进位值
                        bit[i] = bit[i] % 10;//当前的第一位数
                        i ++ ;
                        bit[i] = carray;//在下一位保存进位值
                    }
                }
            }
        }
    
        /**
         * 大整数阶乘
         * @param bigInteger 所计算的大整数
         */
        private  void bigFactorial(int bigInteger)
        {
            int pos =0;//
            int digit;//数据长度
            int a , b ;
            int m = 0 ;//统计输出位数
            int n  = 0 ;//统计输出行数
            double sum = 0;//阶乘位数
            for(a = 1 ; a <= bigInteger ; a ++)//计算阶乘位数
            {
                sum += Math.log10(a);
            }
            digit = (int)sum + 1;//数据长度
    
            int[] fact = new int[digit];//初始化一个数组 
            fact[0]  = 1;//设个位为 1
    
            for(a = 2 ; a <= bigInteger ; a++ )//将2^bigInteger逐个与原来的积相乘
            {
                for(b = digit-1 ; b >= 0 ; b--)//查找最高位{} 
                {   
                    if( fact[b]  !=  0 )
                    {
                        pos = b ;//记录最高位
                        break;
                    }
                } 
    
                for(b = 0; b <= pos ; b++)
                {
                    fact[b] *= a ;//每一位与i乘
                }
                carry(fact,pos);
            }
    
            for(b = digit-1 ; b >= 0 ; b --)
            {
                if(fact[b] != 0)
                {
                    pos = b ;//记录最高位 
                    break;
                }
            }
            
            for(a = pos ; a >= 0 ; a --)//输出计算结果
            {
                System.out.print(fact[a]);
               
            }
           
    
        }
    
        public  void doBigFactorial(int bigInteger)
        {
           
            this.bigFactorial(bigInteger);
          
          
            
        }
    
        public static void main(String[] args)
        {
            Main bi = new Main();
            Scanner input = new Scanner(System.in);
            int num = input.nextInt();
            bi.doBigFactorial(num);
        }
    }
  • 相关阅读:
    今日进度
    今日进度
    每周总结
    今日进度
    今日进度
    今日进度
    flask展示Excel
    ubuntu 相关
    python解析xml三种方法【ElementTree】【DOM】【SAX】
    Lambda实现if...elif...else【三元表达式】
  • 原文地址:https://www.cnblogs.com/airycode/p/5314447.html
Copyright © 2011-2022 走看看