標題:第幾個幸運數
到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進行判斷。