lucky number

题目描述

李老师的lucky number 是3,5和7,他爱屋及乌,还把所有质因数只有3,5,7的数字认定为lucky number,比如9, 15, 21, 25等等。请聪明的你帮忙算一算小于等于x的lucky number有多少个?

输入数据

一个正整数x,3=<x<=1000000000000

输出数据

小于等于x的lucky number的个数。

分析

//假设我们已经获得了一段lucky number序列
// M是这段序列中的最大值
// 我们希望扩充这段序列,直到M达到给定的数值那么大
// 如何扩充?
// 下一个lucky number一定是由当前序列中的某个数*3,*5或者*7得到的
// 我们把可能产生下一个lucky number的数字记为m3, m5和m7
// 他们满足:
//		序列中所有小于m3的数乘以3均不大于M, m3 * 3 > M
//		序列中所有小于m5的数乘以5均不大于M, m5 * 5 > M
//		序列中所有小于m7的数乘以7均不大于M, m7 * 7 > M
// 那么下一个lucky number将会是 min{m3*3, m5*5, m7*7},我们记作new_M
// 如何更新m3, m5, m7呢?
// new_M <= m3*3, new_M <= m5*5, new_M <= m7*7
// 如果new_M = m3*3,那么m3向后推一位,取序列中它的下一个数就可以了,m5和m7则不变
// 如果new_M = m5*5或者m7*7则同理
// 
// 考虑初始情况,我们的序列为3, 5, 7
// M = 7, m3 = 3, m5 = 3, m7 = 3
// new_M = 9, new_m3 = 5, new_m5 = 3, new_m7 = 3
//

代码

#include<iostream>
#include<vector>
using namespace std;

int main() {
	long long x;
	cin >> x;

	if (x < 7) {
		int res = 2;
		x < 5 ? --res : 0;
		x < 3 ? --res : 0;
		cout << res << endl;
		return 0;
	}

	vector<long long> ln(0x1000);	//lucky number
	ln[0] = 3;
	ln[1] = 5;
	ln[2] = 7;
	int m3 = 0, m5 = 0, m7 = 0, M = 2;	//m3, m5, m7, M均为元素下标,便于处理
	long long N3, N5, N7, new_ln;	//N3, N5, N7是m3, m5, m7对应的值

	while (ln[M] <= x) {
		N3 = ln[m3] * 3;
		N5 = ln[m5] * 5;
		N7 = ln[m7] * 7;

		new_ln = N3 < N5 ? N3 : N5;
		new_ln = N7 < new_ln ? N7 : new_ln;
		new_ln == N3 ? ++m3 : 0;
		new_ln == N5 ? ++m5 : 0;
		new_ln == N7 ? ++m7 : 0;

		ln[++M] = new_ln;
	}
	cout << M << endl;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值