大數階乘

flag

藍橋杯第14天

題目介紹

一個整數n的階乘可以寫成n!,它表示從1到n這n個整數的乘積。階乘的增長速度非常快,例如,13!就已經比較大了,已經無法存放在一個整型變量中;而35!就更大了,它已經無法存放在一個浮點型變量中。
  因此,當n比較大時,去計算n!是非常困難的。幸運的是,在本題中,我們的任務不是去計算n!,而是去計算n!最右邊的那個非0的數字是多少。
  例如,5!=12345=120,因此5!最右邊的那個非0的數字是2。
  再如,7!=5040,因此7!最右邊的那個非0的數字是4。
  再如,15!= 1307674368000,因此15!最右邊的那個非0的數字是8。
  請編寫一個程序,輸入一個整數n(0<n<=100),然後輸出n!最右邊的那個非0的數字是多少。
輸入:
  7
輸出:
  4

思路

使用java特有的BigInteger 類,可以解決很大的數的問題。
1.可以將int或者long轉爲BigInteger對象,方法爲BigInteger.valueOf(n)
2.將BigInteger對象轉換爲字符串:toString方法
3.加減乘除都是單獨的函數,不能用運算符
add() substract() multiply() divide()

因此這道題只要先算出階乘,轉換爲字符串後,再將字符串從右到左進行遍歷,發現不是0即可輸出。

代碼


import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input=new Scanner(System.in);
        int n=input.nextInt();

        String s=jie(BigInteger.valueOf(n)).toString();
        for(int i=s.length()-1;i>=0;i--){
            if(s.charAt(i)!='0'){
                System.out.println(s.charAt(i));
                break;
            }
        }
    }




    public static BigInteger jie(BigInteger n){

        if(n.equals(BigInteger.ONE))
            return BigInteger.ONE;
        return n.multiply(jie(n.subtract(BigInteger.ONE)));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章