藍橋杯練習題----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

 

我們可以知道要想得到最右邊的非0數字,我們可以對得到的階乘對10取餘,因爲最右邊的數只與後幾位有關,所以我們可以取後3位,若只取1,2位不能保證得到的一定是非0的。

AC代碼:

#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
	int n,t=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++){ //在求階乘的過程中求解問題
		t*=i;
		while(t%10==0){ //去掉得到的結果中後面的0
			t/=10;
		}
		int a=t%10; //得到後3位非0的數
		t/=10;
		int b=t%10;
		t/=10;
		int c=t%10; 
		t=c*100+b*10+a;
		if(i==n){ //已經得到n的去除0之後的階乘的後3位
			t%=10; //得到最後一位
		}
	}
	printf("%d\n",t);
	return 0;
} 

 

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