劍指offer之尋找醜數,待字閨中之序列產生分析

來源:互聯網
上載者:User

標籤:待字閨中   劍指offer   演算法   找工作   數字分析   

題目來源:劍指offer之尋找醜數 與 待字閨中之序列產生分析

兩個題目其實是同一個問題,所有放在一起,算是總結一下,題目如下:

給定一個運算式2^i*2^j,其中i,j為非負整數。請找到一種方法,產生如下序列:

2^0 * 5^0 = 12^1 * 5^0 = 22^2 * 5^0 = 42^0 * 5^1 = 52^3 * 5^0 = 82^1 * 5^1 = 102^4 * 5^0 = 162^2 * 5^1 = 202^0 * 5^2 = 25.........

閱讀題目,要得到產生的數字序列是有序的,儘管題目中,並沒有明說。這個題目的方法,是比較多的。我們在這裡介紹幾個。

一個簡單的方法

很多同學,應該接觸過醜數那個題目吧?這個題目相比之下,還要簡單一些。i,j分別是2和5的指數, 則方法的過程如下:

i,j 從0開始,記錄較小的值作為序列的當前產生值。則i=j=0時,最小值為1,就是第一個元素;

兩個值都是最小元素,所以i和j,都自增1,在最小值1的基礎之上乘以2和5得到2,5, 取較小的2作為序列的值,即2,第二個;

此時,只對i進行變化,自增1,在其上一個值的基礎之上乘以2,即,2*2=4,再與5比較最小值。具體代碼如下:

vector<int> UglyNumber(int n){vector<int> ugly(n);ugly[0] = 1;int i2 = 0,i5 = 0,index;//i2和i5表示當前即將乘以2和5的下標for(index = 1;index < n;index++){int curUgly = min(ugly[i2]*2,ugly[i5]*5);ugly[index] = curUgly;while(ugly[i2] * 2 <= curUgly)i2++;  //修改i2while(ugly[i5] * 5 <= curUgly)i5++; //修改i5}return ugly;}int main(){int n;while(cin >> n){vector<int> ugly = UglyNumber(n);for(int i = 0;i < n;i++)cout << ugly[i] << " ";cout << endl;}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.