标题:第几个幸运数
到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进行判断。