h0040. 丑数

丑陋数是指那些质因数只有2、3或5的数。序列
1、2、3、4、5、6、8、9、10、12、15、……
显示前11个丑陋的数字。按照惯例,包含1。
输入的每一行给出一个正整数n(1≤n≤1500), 编写程序求第 n 个丑数的值。

输入格式:

输入的每一行给出一个正整数n(1≤n≤1500), 以n=0为结束标志。

输出格式:

对每一组输入,在一行中输出第 n 个丑数的值。

输入样例:

1
2
5
0

输出样例:

1
2
5
// 思路:如果能被2整除就连续除以2,如果能被3整除就连续除以3,如果能被5整除就连续除以5,
//      若最后除下来为1则该数是丑数,先用该方法查找出一定的丑数并且是排好序的,再通过查找出的丑数找出剩余的丑数
// 用丑数查找丑数:按顺序下一个丑数是前面的丑数乘以2、3或5的结果,先分别找出乘以2、3、5的丑数(M2,M3,M5),
//      并找出第一次大于最后一个丑数的M2、M3、M5,即下一个丑数就是取三个中的最小值( min( M2, M3, M5) )
#include<bits/stdc++.h>
using namespace std;
bool check( int x ) //判断是否是丑数
{
    while(x%2 == 0) x/=2; //连续除以2
    while(x%3 == 0) x/=3; //连续除以3
    while(x%5 == 0) x/=5; //连续除以5
    return x == 1; //若为1返回true,否则返回false
}
vector<long long> res;
void find(int x) //查找出下一个丑数
{
    int a2=0, a3=0, a5=0, r;
    while(res[a2]*2 <= x) a2++; //查找出前面的丑数乘以2第一次大于最后一个丑数的位置(丑数的位置)
    while(res[a3]*3 <= x) a3++; //查找出前面的丑数乘以3第一次大于最后一个丑数的位置(丑数的位置)
    while(res[a5]*5 <= x) a5++; //查找出前面的丑数乘以5第一次大于最后一个丑数的位置(丑数的位置)
    r = res[a2]*2<res[a3]*3 ? res[a2]*2:res[a3]*3; //找最小
    r = r<res[a5]*5 ? r:res[a5]*5; //找最小
    res.push_back( r );
}
int n;
int main()
{
    for(int i=1; res.size()<=500; i++) //先找出一些丑数
        if( check( i ) ) //判断是否是丑数
            res.push_back(i);
    while(res.size() <= 1500) find( res.back() ); //将剩下的丑数找出来
    while( cin>>n && n!=0)
        cout << res[n-1] << endl;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值