问题描述:第几个幸运数
到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吗??疑惑。。。一直没理解。。。