第几个幸运数

标题:第几个幸运数

到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进行判断。
 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值