1500个丑数

题:只有2 3 5 这三个因子的数,求第1500个   设1 为第一个丑数

 

解法:

1 简单的暴力搜索,对每个数进行因子判别,直到搜到第1500个

评价:耗时 不可取

2 将得到的数保存在一个数组中,按从小到大的顺序进行存放,对该数组前面的数分别乘以2 3 5,每乘一个因子,先乘到刚好大于该数组最大的值,然后break

进行下一个因子相乘  ,得到三个数,比较得到这三个数中的最小值,push进当前数组最后。

这里可以用三个下标来分别保存2 3 5 在数组中开始相乘的起始下标位置,就避免了每次都从数组的开头开始相乘,每次更新的依据为:上面三个数哪个最小,对应的那个因子

的下标进行更新

 

源代码如下:

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

int min3(int a,int b,int c)
{
	int tmp=(a<b?a:b);
	return (tmp<c?tmp:c);
}
int main()
{
	vector<int> uglyNum;
	uglyNum.push_back(1);  //初始只有1在数组中
	int t2=0,t3=0,t5=0; //每个因子开始相乘的下标位置
	int i,j,k;
	while(uglyNum.size()!=1500)
	{
		int m2,m3,m5;  //保存每个因子得到的值
		for(i=t2;i<uglyNum.size();i++)
			if(2*uglyNum[i]>uglyNum.back())
			{
				m2=2*uglyNum[i];
				break;
			}
		for(j=t3;j<uglyNum.size();j++)
			if(3*uglyNum[j]>uglyNum.back())
			{
				m3=3*uglyNum[j];
				break;
			}
		for(k=t5;k<uglyNum.size();k++)
			if(5*uglyNum[k]>uglyNum.back())
			{
				m5=5*uglyNum[k];
				break;
			}
		int tmp = min3(m2,m3,m5);
		uglyNum.push_back(tmp);
		if(tmp==m2)
			t2=i+1;  //下标位置进行更新
		if(tmp==m3)
			t3=j+1;
		if(tmp==m5)
			t5=k+1;
	}
	for(int i=0;i<uglyNum.size();i++)
		cout<<uglyNum[i]<<" ";
	cout<<endl;
	return 0;
}


 

运行得到的值为 : 859963392
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值