Humble Numbers 醜數 超詳解!

2021-09-07 09:25:25 字數 2122 閱讀 5778

給定乙個素數集合 s = ,大於 1 且素因子都屬於 s 的數我們成為醜數(humble numbers or ugly numbers),記第 n 大的醜數為 h[n]。

演算法 1:

演算法 2:

看來只有乙個乙個地主動生成醜數了 :

我最早做這題的時候,用的是一種比較爛的生成方法,複雜度為 o( k * n * log(n) )。

演算法流程如下:

1.初始化最小堆,內建乙個元素 1

2.i=0 ,表示求第 i 個醜數(預設 h[0]=1)

3.if i>n then goto 7

4.取出堆中最小的元素 x(如果有多個最小元素,全部取出來), h[i]:= x,i:=i+1

5.把 x*p[1] , x*p[2] ... ,x*p[n] 放入堆中

6.goto 3

7.結束

這個演算法要使用乙個最小堆(heap)的資料結構,。不會超時。

演算法 3:

演算法2雖然速度還可以,但是演算法複雜度還是有點高。這裡介紹一下 usacogate 提供的標準程式的演算法。首先我們知道這樣的東西:如果前 m-1 個醜數已經求出來了(包含 0),那麼第 m 個數肯定是由前面某個醜數乘 s 裡的素數得來的。假設是 h[pindex[i]] 乘 p[i] 而得到 h[m] 的話,把每次乘 p[i] 的 pindex[i] 列出來,肯定是單調的!利用這個,我們可以得到這樣的演算法:

1.nhum=0 ,表示求第 nhum 個醜數(預設 h[0]=1)

2.令 pindex[i]=0 ,表示一開始無論怎麼乘,都是乘 h[0]

3.if (nhum > n ) then goto 7

4.分別求出 h[pindex[i]]*p[i]的值,找出比 h[nhum-1] 大的最小值

5.把這個最小值 h[pindex[minp]]*p[minp] 存入 h[nhum]

6.nhum:=nhum+1;

7.結束

這個演算法複雜度顯然為 o( n * k ),已經相當不錯了

以上是某個部落格的做題心得吧!我把他引用過來僅僅為了介紹醜數的概念

我就以一道例題介紹醜數吧!

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

我們給你個n(1<=m<=5842)當輸入n為0結束。

輸出第n個醜數。每個數一行。

123

411

123

412

關於醜數的含義在題目中已有解釋,有的題目中忽略了「7」這個質因子,其實這都不是最重要的重要的是掌握其處理的方法。
首先,判斷乙個數是否為醜數的方法如下:
1

int find_uglynum(inta)2

但是這種方法過於費時,下面給出該題解題思路:
首先,第乙個醜數為「1」,後面的每乙個醜數都是由前乙個醜數乘2、3、5或7而來,那麼後乙個醜數就是前乙個乘這四個數得到的最小值,for example:第乙個:1,第二個:1*2、1*3、1*5或1*7,顯然為2,第三個:2*2,1*3,1*5或1*7,顯然是3,第四個:2*2,,2*3,1*5,1*7為4,第五個:3*2,2*3,1*5,1*7……   聰明的你是否看明白了呢?

下面給出本題的**:
1 #include 2 #include 3

using

namespace

std;

4#define min(a,b) ((a)<(b)?(a):(b))

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

6int a[5850];7

intmain()825

while(scanf("

%d",&n)&&n)

2629

return0;

30 }

leetcode 263 醜數(醜數II)

給了我們乙個醜數的概念,真是為了考驗我們什麼手段都能使出來。首先說一下第乙個題目,判斷乙個數是不是醜數,就是不斷地去除5 除3 除2就行了,當然除之前看看餘數是不是0,否則的話說明已經不能被這三個數整除了,直接結束 public boolean isugly int num return flag ...

刷題 醜數提取及醜數判斷

把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。根據醜數的定義,我們知道醜數一定是由2 3 5乘積得到,可表示成如下公式 我們預設1是第乙個醜數,初始醜數序列為1,從1開...

64 尋找醜數

64.尋找醜數。題目 我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 例如 6 8 都是醜數,但 14 不是,因為它包含因子 7。習慣上我們把 1 當做是第乙個醜數。求按從小到大的順序 的第 1500 個醜數。分析 這是一道在網路上廣為流傳的面試題,據說 google 曾經採...