到x星球旅行的游客都被发给一个整数,作为游客编号。x星的国王有个怪癖,他只喜欢数字3,5和7。国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品。我们来看前10个幸运数字是:3 5 7 9 15 21 25 27 35 45。因而第11个幸运数字是:49。小明领到了一个幸运数字 59084709587505,他去领奖的时候,人家要求他准确地说出这是第几个幸运数字,否则领不到奖品。
请你帮小明计算一下,59084709587505是第几个幸运数字。
刚开始就想的是暴搜,结果发现59084709587505被截断 → 32位int:-2147483648 ~ 2147483647;64位int:-9223372036854775808 ~ 9223372036854775807。
#include <iostream>
using namespace std;
int main()
{
long long int num = 59084709587505;
int cnt = 0;
for (int i = 3; i <= num; ++i)
{
if (i % 3 == 0 || i % 5 == 0 || i % 7 == 0)
{
cnt += 1;
}
}
cout << cnt << endl;
return 0;
}
但是,程序太慢了……
改进:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long MAX = 59084709587505l;
int count = 0;
for (long long i = 0; pow(double(3), double(i)) < MAX; ++i)
{
for (long long j = 0; pow(double(5), double(j)) < MAX; ++j)
{
for (long long k = 0; pow(double(7), double(k)) < MAX; ++k)
{
if (pow(double(3), double(i)) * pow(double(5), double(j)) * pow (double(7), double(k)) < MAX)
{
count += 1;
}
}
}
}
cout << count << endl;
return 0;
}