标题:第几个幸运数(数学)

到x星球旅行的游客都被发给一个整数,作为游客编号。
x星的国王有个怪癖,他只喜欢数字3,5和7。
国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。

我们来看前10个幸运数字是:
3 5 7 9 15 21 25 27 35 45
因而第11个幸运数字是:49

小明领到了一个幸运数字

,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。

请你帮小明计算一下,59084709587505是第几个幸运数字。

需要提交的是一个整数,请不要填写任何多余内容。

答案:1905

解题思路:

        直接寻找幸运数,任何一个幸运数数都是  3^i * 5^j*7^k 这种形式的,因此不断寻找幸运数数,将他们按从小到大的顺序进行排列,直到找到目标幸运数为止。首先定义一个数组存放幸运数,初始化数组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,依次进行如上操作,得到最终的结果。

代码:

#include<iostream>
using namespace std;
typedef long long ll;
const ll N =59084709587505;
ll a[2005];
int main()
{
	a[0]=1;
	int num_3=0,num_5=0,num_7=0;
	int i;
	for(i=1;a[i-1]<N;i++)
	{
		a[i]=min(min(a[num_3]*3,a[num_5]*5),a[num_7]*7);
		if(a[i]/a[num_3]==3) num_3++;
		if(a[i]/a[num_5]==5) num_5++;
		if(a[i]/a[num_7]==7) num_7++;
	}
	cout<<i-1<<endl;
	cout<<a[i-1]<<endl;
	return 0;
} 
if(a[i]/a[num_3]==3) num_3++;
if(a[i]/a[num_5]==5) num_5++;
if(a[i]/a[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进行判断。

猜你喜欢

转载自blog.csdn.net/daoshen1314/article/details/88542954