例題5 7 醜數 UVa136

2021-07-24 16:55:17 字數 1528 閱讀 5420

演算法

競賽入門經典(第2版) 第5章c++與stl入門 例

題5-7  醜數

uva136

感悟。

,菜題乙個。

2、基本思路,能被2整除,一直除2;能被3整除,一直除3;能被5整除,一直除5;最後值為1,則為醜數。

3、編好提交 limit exceeded,菜題不菜,感受到競賽題的威力。

4、用printf("time used = %.2f\n",(double)clock()/clocks_per_sec);測試時間23.21s,

5、這個思路有點牛:可以用暴力先把答案算出來。

6、提交wa,一查,少了最後乙個.號,修改,提交ac,在提交ac,看看時間,2016-11-17 18:39

7、對此題一直念念不忘,

一絲想法飄過,set集合中元素不可重複,非1醜數,醜數/2或醜數/3或醜數/5必是醜數,馬上編碼,應該**量很小,耗時明顯較短。但上機一除錯,耗時巨大。

8、通過

三篇部落格學習了優先佇列,效果還不錯。

9、點評書中**,寫點不一樣的地方:

一、因每次插入2x,3x,5x,故用int必越界,所以用long long,typedef方便原因有2,1是定義變數書寫**方便,2是方便測試,如typedef int ll;

二、因要查詢佇列中的元素,佇列沒有提供專門方法,故用set進行中轉,所以set不能省;

三、將2,3,5放在整數陣列中,寫起**for迴圈就搞定,不用2寫一次,3寫一次,5寫一次。

四、因為處理的資料都是醜數,不存在非醜數的計算,所以運算量小了許多許多,所以寫出的**才能通過測試。

附上ac**,編譯環境dev-c++4.9.9.2

#include

int main()

以上ac**的答案,來自time limit exceeded

**,如下:

#include

//#include

//#include

using namespace std;

int main()

while(ans%3==0)

while(ans%5==0)

if(ans==1)

if(count==1500)

break;

}cout<<"the 1500'th ugly number is "《兩個**造就了ac程式。此時2016-11-17 18:33

附上消化書中寫的ac**。

#include

#include

#include

using namespace std;

typedef long long ll;

int main();

int j;

pq.push(1);

s.insert(1);

for(i=1;;i++){

x=pq.top();

pq.pop();

if(i==1500){

cout<<"the 1500'th ugly number is "<

Uva136 醜數 優先佇列

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

例題5 7 醜數

描述 醜數是指不能被2,3,5以外的其他素數整除的數。把醜數從小到大排列起來,結果如 下 1,2,3,4,5,6,8,9,10,12,15,求第1500個醜數。思路 從小到大依次生成。最基礎的醜數是1,而後的所有醜數都是在這個基礎上生成的。如果按照正向思維分析,需要考慮除2,3,5以外的所有素數 這...

UVA136解題報告

先來份錯誤 親愛的小夥伴們,希望你們能找到其中的問題,順便說一句,用的是廣搜 include includeusing namespace std int main printf d n q.front return 0 上面是我用很短的時間寫出來的很漂亮的 如果說有什麼不完美的地方,那就是他是錯的...