20 02 12 醜數 佇列

2021-10-02 18:24:44 字數 1634 閱讀 6049

nefuoj574醜數

只有質數2,3,5,7這幾個作為因子的數叫做醜數,比如前19個醜數是1,2,3,4,5,6,7,8,9,10,12,14,15,16,18,20,21,24和25.

求第n小的醜數,其1中<=n<=5842

模擬blash數集:

(法1)維護4個單調佇列,分別儲存x

xx生成的2x,

3x,5

x,7x

2x,3x,5x,7x

2x,3x,

5x,7

x的結果

#include

using

namespace std;

const

int maxn=

5842

;const

int inf=

2147483647

;queue <

int> q1,q2,q3,q4;

int p1,p2,p3,p4;

//q1...q4分別儲存x*2,x*3,x*5,x*7的拓展結果

int a[maxn+10]

;int

getmin

(int a1,

int a2,

int a3,

int a4)

int main (

)int n;

while

(cin>>n && n)

cout<

}

(法2)只維護1個單調陣列,同時記錄4種生成法則對應的下標

#include

using

namespace std;

const

int maxn=

5900

;const

int inf=

2147483647

;const

int pri[6]

=;int pos[6]

=;//p[i]±íê¾µúi¸ööêêýéïò»´î²îóëôëëãµäî»öã

int a[maxn+10]

;int main ()}

a[i]

=minn;

for(

int j=

1;j<=

4;j++

)//pos[p]++;

//cout<}

int n;

while

(cin>>n && n)

cout<

}

#include

#define min4(a,b,c,d) min(min(a,b),min(c,d))

using

namespace std;

int n,p2,p3,p5,p7,a[

5850];

//定義min4(a,b,c,d),找四個數中的最小值

intmain()

while

(cin>>n&&n)

printf

("%d\n"

,a[n]);

return0;

}————————————————

86081513

醜數 優先佇列 詳細解答

題目 醜數是一些因子只有2,3,5的數。數列1,2,3,4,5,6,8,9,10,12,15 寫出了從小到大的前11個醜數,1屬於醜數。現在請你編寫程式,找出第1500個醜數是什麼。輸出 the 1500 th ugly number is 為你找到的第1500個醜數 注意 是你找到的數,輸出中沒有...

Uva136 醜數 優先佇列

找出第1500個素因子只能有2或3或5的數。懵逼了吧,並不是素因子篩,用2,3,5去篩並不能得到滿足醜數要求的數,例如14就篩不掉。優先佇列每次取乙個最小的數x,2x,3x,5x,都是醜數,但是每次要判斷是否有重數 set 取1500,每次都是取出最小的數,取1500次之後就是第1500個數。inc...

lintcode 4 醜數 II(優先佇列)

設計乙個演算法,找出只含素因子2,3,5的第 n 大的數。符合條件的數如 1,2,3,4,5,6,8,9,10,12.看到題的第乙個想法一直向下列舉 直到找到第n個數 我的思路是 每乙個醜數都是由乙個醜數乘2乘3乘5得來的,可以把第乙個醜數也就是1放進優先佇列中,然後進行n次操作每次取出隊頭然後把隊...