满足条件的第n个数

该博客探讨了一道寻找满足pow(2, i)*pow(3, j)*pow(5, k)形式的第n个数的问题。通过分析前11个数,发现每个后续数要么是2、3、5的幂的乘积。为提高效率,提出从当前数列的末尾开始,依次计算2x、3y、5z的最小值作为下一个数,并更新这三个值。博主提供了相应的代码实现。" 125044443,12096109,C语言实现二叉树深度优先与广度优先遍历,"['C语言', '数据结构', '二叉树遍历']
摘要由CSDN通过智能技术生成

题目:寻找满足pow(2, i)*pow(3, j)*pow(5, k)的第n个数,其中ijk大于等于0,例如前11个数分别为:1 2 3 4 5 6 8 9 10 12 15。

分析:本题中ijk没有任何规律,最简单的办法也是最直接的办法,就是从1开始遍历每一个数,如果满足只有2、3、5作为质因子的就计数,计数到n就是所求的数。但是这个方法明显效率很低。

根据题意,前11个组成的数列为:1 2 3 4 5 6 8 9 10 12 15,仔细分析,第12个数必定满足只有2、3、5作为质因子,因此这个数一定要么是2*x,要么是3*y,要么是5*z,同时xyz也必须满足题中的条件,才能使它们的乘积也满足条件,题中列出了所有满足条件的值,因此只需要在当前数列中寻找xyz即可。当前数列的最后一个数是15,因此x至少要大于15/2也就是7,因此x=8,2*x=16;同样假设是3*y,则y=6,3*y=18;若是5*z,则z=4,5*z=20。

根据以上的分析可知,每次计算下一个数的时候只需要计算min(2x, 3y, 5z)即可,同时还需要更新2x, 3y, 5z。

代码实现:

int getNth( int n )
{
	if ( n <= 0 )
		return -1;
	int a[3] = { 2, 3, 5 };
	int b[18] = { 1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30 };
	if ( n <= 18 )
		return b[n-1];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值