例題分享 2 3 5抽數

2021-08-29 18:17:43 字數 1257 閱讀 5595

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

主要就是利用類似於遞迴的思想,或者說是分解+法的方法。

方法一:

每乙個醜分解之後只有2/3/5,假設乙個數是x,有x=2

i⋅3j

⋅5

kx=2^i \cdot 3^j \cdot 5^k

x=2i⋅3

j⋅5k

其中肯定是k的係數要小的多, 通過死算,逐步逼近範圍,第100個數,逼近範圍還是可以算出來的,不要小瞧這種計算,原子彈都能計算這個肯定也能計算就看你願不願計算。當然數量過大就還是不要計算吧,筆者以前在競賽時就計算過,計算的速度比寫**要快,當然當時寫**菜的一塌糊塗。

方法二:類似遞迴的方法——下標遷移法

只能是類似遞迴,並不是真正意義上的遞迴,也就是有點意思,但是不是,不說廢話,直接展開:

分析乙個就是上面的那個公式一樣,每乙個數都是2/3/5的倍數,也就是說第乙個數是1,第二個數,是之前的數每個*2 、*3、 *5然後選擇最小的那個,當做新元素。f(n

+1)=

mi

nf(n+1)=min\

f(n+1)

=min

是不是很像遞迴,但是抱歉,並不是遞迴。因為並不好寫遞迴的方法,如果有大牛看到了,寫出來了,不要忘記發一下,學習學習。注意:這裡分f(n)並不是只是前乙個元素,是之前的狀態量!狀態量!狀態量!啥是狀態量?就是乙個集合。

設定每個量*2 *3 4的乙個表示量,也就是**裡面的int m2 ,int m3 ,int m5 表示陣列下標,就是下標為m2的這個數是現在這個2的數。f(n

+1)=

mi

nf(n+1)=min\

f(n+1)

=min

一開始都指向下標為0的元素,第乙個非零元素2進入開始,下標就開始不一樣了,可以寫一下

每一次取最小值,然後更新下標了,為什麼3個if就是因為三個條件的才能選擇合適的更新的方式,有重複的情況,都更新一下,躲避陣列加入重複數字,如果不重複,不會都滿足情況。

下面上**

#include#includeusing namespace std;

int getuglynumber(int index)

return result[index - 1];

}int main()

{ int index;

cin>>index;

cout《參考資料:

神奇的235數

當乙個數n的質因子只含有2,3,5的時候,我們可以將n稱為235數 事實上叫醜數 那麼,問題來了,給你乙個數n,你能求出第乙個大於等於n的235數是多少嗎?程式設計解決這個簡單的問題吧 輸入多組輸入 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t 30000 第2 t 1行 每行1個數n ...

kettle 分頁抽數

1 分頁 2 變數設定 全域性 區域性 3 查詢總資料量,並設定變數 select count 1 total page from dmlog policy t where 1 1 and t.trans status in 0 3 and contractid between and and ri...

醜數(因子只有 2 3 5 的數)

理解題意關鍵 如果說乙個數的因子只有 2 3 5 那麼反過來想,這個數一定是由若干個 2 3 5 相乘得到的,所以每一次只需要找出當前所有已知醜數中由2 3 5 相乘可以得到的最小的數即可。也就是說每乙個醜數,都可以由之前的醜數乘 2 3 5 得到。具體做法 設定三個指標,初始他們都指向第乙個醜數 ...