藍橋算法訓練 P0505--階乘

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

思路:(1)要確定只要最後一位非零的數字即可,所以每次要先判斷是否爲0,再判斷只需要模還是要除再模,也就是下面的if和else;(2)當輸入的是1時,不知道爲什麼如果我不加最開始判斷n的條件就會輸出兩個1,所以我在最開始的地方加了個判斷n是否爲1的條件;(3)輸出的時候要判斷是否爲0,若爲0也需要先除再模。

代碼:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int i,n,p=1,m;
    cin>>n;
    if(n==1)
        cout<<n;
    else
    {
    for(i=n;i>0;i--)
    {
        p*=i;
        m=p%10;
        if(m!=0)
        {
            p=m;
        }
        else
        {
            m=p/10%10;
            m*=i;
        }
    }
    if(p%10!=0)
    cout<<p%10<<endl;
    while(p%10==0)
    {
        p=p/10;
    }
    cout<<p%10<<endl;
    }

	return 0;
}

運行結果:

綜上所述,不足之處在於正確率只有70%,題目不是很難,但是中間模和除那裏有點繞,最好先在紙上寫好了然後再上機,有不足的地方大家多多指出!

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