第幾個幸運數

標題:第幾個幸運數

到x星球旅行的遊客都被髮給一個整數,作爲遊客編號。
x星的國王有個怪癖,他只喜歡數字3,5和7。
國王規定,遊客的編號如果只含有因子:3,5,7,就可以獲得一份獎品。

我們來看前10個幸運數字是:
3 5 7 9 15 21 25 27 35 45
因而第11個幸運數字是:49

小明領到了一個幸運數字 59084709587505,他去領獎的時候,人家要求他準確地說出這是第幾個幸運數字,否則領不到獎品。

請你幫小明計算一下,59084709587505是第幾個幸運數字。

需要提交的是一個整數,請不要填寫任何多餘內容。

【答案】1905

【解題思路】

直接尋找幸運數,任何一個幸運數數都是2^i * 3^j * 5^m這種形式的,因此不斷尋找幸運數數,將他們按從小到大的順序進行排列,直到找到目標幸運數爲止。首先定義一個數組存放幸運數,初始化數組luck[0] = 1,然後從3,5,7這三個種子中挑選,選擇luck[0]*3,luck[0]*5,luck[0]*7中最小的數爲新的幸運數,顯然應該選擇3,即luck[1] = 3,然後在從3,5,7中選擇,這時應該是從luck[1]*3,luck[0]*5,luck[0]*7中進行選擇,顯然選擇5,即luck[2] = 5,然後再從luck[1]*3,luck[1]*5,luck[0]*7中選擇最小的,選擇2,即luck[3] = 7,依次進行如上操作,得到最終的結果。

#define N 59084709587505
#include<iostream>
using namespace std;
int main(){
	int i;
	long long*luck=new long long[2000];
	for(int j=0;j<2000;j++){
		luck[j]=0;
	}
	luck[0]=1;
	int num_3=0;
	int num_5=0;
	int num_7=0;
/*不能設luck[i]爲結束條件,因爲在這裏luck[i]=0,luck[i]與i不同步,當i=13時luck[13]還在等於0*/
	for( i=1;luck[i-1]<N;i++){
/*min()函數的形參是兩個而不是三個,故需要調用兩個min函數比較三個數中的最小值*/
		luck[i]=min(min(luck[num_3]*3,luck[num_5]*5),luck[num_7]*7);
		if(luck[i]/luck[num_3]==3)
			num_3++;
		if(luck[i]/luck[num_5]==5)
			num_5++;
		if(luck[i]/luck[num_7]==7)
			num_7++;
	}
	cout<<i-1<<endl;
	cout<<luck[i-1]<<endl;
} 

以上代碼即實現理想結果,但我要強調一下下面這幾行代碼

                if(luck[i]/luck[num_3]==3)
			num_3++;
		if(luck[i]/luck[num_5]==5)
			num_5++;
		if(luck[i]/luck[num_7]==7)
			num_7++;
這幾段代碼的意思是找出到底是3,5,7中哪個種子計算出的luck[i],當然,有可能有多個種子,比如luck[num_3]*3 == luck[num_5]*5時,需要把num_3++,並且要使num_5++。因此這裏不能使用if-else,要全部使用if進行判斷。

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