把只包含质因子2、3和5的数称作丑数

把只包含质因子2、3和5的数称作丑数

问题描述:

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第 n个丑数。

输入
7
输出
8


class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        // 0-6的丑数分别为0-6
        if(index < 7) return index;
        //p2,p3,p5分别为三个队列的指针,newNum为从队列头选出来的最小数
        int p2 = 0, p3 = 0, p5 = 0, newNum = 1;
        vector<int> arr;
        arr.push_back(newNum);
        while(arr.size() < index) {
            //选出三个队列头最小的数
            newNum = min(arr[p2] * 2, min(arr[p3] * 3, arr[p5] * 5));
            //这三个if有可能进入一个或者多个,进入多个是三个队列头最小的数有多个的情况
            if(arr[p2] * 2 == newNum) p2++;
            if(arr[p3] * 3 == newNum) p3++;
            if(arr[p5] * 5 == newNum) p5++;
            arr.push_back(newNum);
        }
        return newNum;
    }
};

#include<bits/stdc++.h>
using namespace std;
int n,sum;
bool isprime(int k){
    for(int d=1;d<=sqrt(k);d++){
        if(k%d==0) return 1;
    }
    return 0;
}
int main(){
    cin>>n;
    if(n==1){
        cout<<'1';
        return 0;
    }
    n--;
    for(int i=1;;i++){
        if(i%2==0||i%3==0||i%5==0){
            if(i%2==0){
                if(isprime(i%2)) continue;
            }
            if(i%3==0){
                if(isprime(i%3)) continue;
            }
            if(i%5==0){
                if(isprime(i%5)) continue;
            }
            sum++;
        }
        if(sum==n){
            cout<<i;
            break;
        }
    }
    return 0;
}

供参考:

#include<stdio.h>
#define min(x,y) ((x)>(y)?(y):(x))
__int64 UglyNumber(int n)
{
    __int64 UglyNum = 0, * m = new __int64[n];
    m[0] = 1;
    int a = 0, b = 0, c = 0;
    for (int i = 1; i < n; i++) {
        m[i] = min(min(m[a] * 2, m[b] * 3), m[c] * 5);
        if (m[i] == m[a] * 2) {
            a++;
        }
        if (m[i] == m[b] * 3) {
            b++;
        }
        if (m[i] == m[c] * 5) {
            c++;
        }
    }
    UglyNum = m[n - 1];
    delete []m;
    return UglyNum;
}
int main()
{
    int n;
    while (scanf("%d", &n) != EOF && n >= 1 && n <= 10000)//输入 010001 结束 
    {
        printf("%I64d\n", UglyNumber(n));
    }
    return 0;
}