1. 程式人生 > >九度-題目1214:醜數

九度-題目1214:醜數

得到 方法 產生 include pac number return clu n)

http://ac.jobdu.com/problem.php?pid=1214

題目描述:

把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含因子7。
習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。

輸入:

輸入包括一個整數N(1<=N<=1500)。

輸出:

可能有多組測試數據,對於每組數據,
輸出第N個醜數。

樣例輸入:
3
樣例輸出:
3

一開始的想法是遞增遍歷足夠多的數字,得到長度為1500的數組。數組中每個元素對應一個醜數。
這將產生問題:數組中靠後的一些元素是無法遍歷得到的,或者說非常不有效。

因此換一種方法:數組中的後一個元素必然是前面某個元素的2倍/3倍/5倍。每次只要獲得對應的元素即可。

#include <iostream>

using namespace std;

int min3(int a, int b, int c){
    int min=(a<b)?a:b;
    if(min>c)
        return c;
    else
        return min;
}

int getUglyNum(int index){
    if(index<=0)
        return 0;
    int a[index];
    a[0]=1;

    int idx1=0;
    int idx2=0;
    int idx3=0;
    for(int i=1; i<index; i++){
        int min=min3(a[idx1]*2, a[idx2]*3, a[idx3]*5);
        a[i]=min;
        if(min==a[idx1]*2)
            idx1++;
        if(min==a[idx2]*3)
            idx2++;
        if(min==a[idx3]*5)
            idx3++;
    }
    return a[index-1];
}
int main(){
    int n;
    while(cin>>n){
        int Ugly=getUglyNum(n);
        cout << Ugly << endl;
    }
    return 0;
}

  

九度-題目1214:醜數