【34】蓝桥杯之第几个幸运数(填空题)

问题描述:第几个幸运数

到x星球旅行的游客都被发给一个整数,作为游客编号。 x星的国王有个怪癖,他只喜欢数字3,5和7。 国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。我们来看前10个幸运数字是: 3 5 7 9 15 21 25 27 35 45 因而第11个幸运数字是:49小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。请你帮小明计算一下,59084709587505是第几个幸运数字。

#include<bits/stdc++.h>
using namespace std;

int main()
{
		long long MAX =  59084709587505;
//		long long MAX =  49 ;
		int count = 0;
		for ( long long i = 0; pow(3,i) < MAX; ++i)
			for ( long long j = 0; pow(5,j) < MAX; ++j)
				for ( long long k = 0; pow(7,k) < MAX; ++k)
//					if (pow(3,i) * pow(5,j) * pow (7,k) < MAX)//运行结果1906
					if (pow(3,i) * pow(5,j) * pow (7,k) < MAX&&pow(3,i) * pow(5,j) * pow (7,k) > 1 )//运行结果1905 
//					if (pow(3,i) * pow(5,j) * pow (7,k) <= MAX&&pow(3,i) * pow(5,j) * pow (7,k) > 1 )// 运行结果1905
						{count ++;
//						cout<<i<<" "<<j<<" "<<k<<" "<<endl;;
						} 
//		要排除ijk全是0的情况,比如MAX等于2时, ijk全是0,count显示有一种情况 
//		cout<<count-1<<endl;
		cout<<count<<endl;		

	return 0;
}

代码参考链接:https://blog.csdn.net/qq_36561697/article/details/80752392

总结

刚开始真的很蠢的想着,暴力遍历1-59084709587505,其中满足是幸运数字的话就++,但是这样子很慢,效率很低!!
脑子转一下弯,其实就知道幸运数字满足:3^a * 5^b * 7^c。代表有a个3,b个5,c个7相乘。那这样子就可以分别for循环a,b,c的值,并且满足的时候就代表一个幸运数

if (pow(3,i) * pow(5,j) * pow (7,k) < MAX&&pow(3,i) * pow(5,j) * pow (7,k) > 1 )//运行结果1905 
if (pow(3,i) * pow(5,j) * pow (7,k) <= MAX&&pow(3,i) * pow(5,j) * pow (7,k) > 1 )// 运行结果1905

两个运行结果都是1905,因为ijk是受前面的三个for循环里限制的,三个for循环里面都没有<=MAX,只是<MAX,所以两者结果肯定一样。

关于答案的疑惑

网上好多答案都是说是1905.按道理程序跑出的结果是1905,证明前面有1905个幸运数,那59084709587505不应该是第1906个幸运数吗,那答案不是应该是1906吗??疑惑。。。一直没理解。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值