NOJ1167 丑陋数 想法题

题意

丑陋数n的意思是n的所有素数因子只有2,3,5。
求出前1500个丑陋数。(第一个丑陋数是1)

思路

用一个数组维护所有的丑陋数。一开始数组中只有一个数就是1。
现在可以确定的丑陋数还有1*2,1*3,1*5。把这三个数中最小的2放进数组。然后变成了2*2,1*3,1*5。再把最小的一个数放进数组…依次执行下去,直到倒数第三个数填满整个丑陋数数组。
用c2 c3 c5确定目前的和2 3 5相乘的丑陋数。

注意判断三个数有相等的情况。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 1510;
int s[maxn];
int main()
{
    s[1] = 1;
    int c2=1,c3=1,c5=1;
    for(int i = 2 ; i < maxn ; i ++) {
        //????s[i]????
        int s2 = s[c2]*2,s3 = s[c3]*3,s5 = s[c5]*5;
        if(s2 < s3) {
            if(s2 < s5) {
                s[i] = s2;
                c2 ++;
                continue;
            }else if(s2 > s5) {
                s[i] = s5;
                c5 ++;
                continue;
            }else {
                s[i] = s5;
                c2 ++; c5 ++;
                continue;
            }
        }else if(s2 > s3) {
            if(s3 < s5) {
                s[i] = s3;
                c3 ++;
                continue;
            }else if(s3 > s5) {
                s[i] = s5;
                c5 ++;
                continue;
            }else {
                s[i] = s5;
                c5 ++; c3 ++;
                continue;
            }
        }else {//s2 = s3
            if(s2 < s5) {
                s[i] = s2;
                c2 ++; c3 ++;
                continue;
            }else if(s2 > s5){
                s[i] = s5;
                c5 ++;
                continue;
            }else {
                s[i] = s2;
                c2 ++; c3 ++; c5 ++;
                continue;
            }
        }
    }
    int n;
    while(scanf("%d",&n) && n) printf("%d\n",s[n]);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值