时间限制 1000 ms
内存限制 64 MB
题目描述
李老师的lucky number 是3,5和7,他爱屋及乌,还把所有质因数只有3,5,7的数字认定为lucky number,比如9, 15, 21, 25等等。请聪明的你帮忙算一算小于等于x的lucky number有多少个?
输入数据
一个正整数x,3=<x<=1000000000000
输出数据
小于等于x的lucky number的个数。
样例输入
49
样例输出
11
样例说明
int存不下
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
int main()
{
vector<long long> v = {1}; //因为后续要做乘法 所以第一个初始化为1
long long x;
cin >> x;
int a = 0, b = 0, c = 0; //初始化
while (1)
{
long long n3 = v[a] * 3; //不断的对容器里之前的每个数做乘法(乘3 乘5 乘7)运算
long long n5 = v[b] * 5; //n3 n5 n7 分别记录着乘以 3 5 7 的结果
long long n7 = v[c] * 7;
long long Min = min(min(n3, n5), n7); //较小的数字乘了大的因子会打乱有序序列,所以每次做比较,取最小的数字。
if (Min == n3)
a++; //当前数值被记录,继续往后乘
if (Min == n5)
b++;
if (Min == n7)
c++;
if (Min > x)
break; //已找到解
if(Min!=v.back()) //去重 因为1乘3乘5 和1乘5乘3一样 v.back()是取vector中最后一个元素
v.push_back(Min);
}
cout << v.size() - 1 << endl; //因为有1 的存在 所以记得 -1
return 0;
}
数字很大,而且很多数字不是3 5 7组成的,所以直接找3 5 7因子构成的数字。
3*3 3*5 3*7
9*3 9*5 9*7=63
15*3=45 15*5=75 15*7
21*3 21*5 21*7
乘起来的数字 不是有序的 所有要排序 去重
因为每次得到的数字都是三个
数据结构:优先队列 基本有序 堆
每次拿最小的数字作为幸运数字 每次top取到的都是最小数字