1 醜數---只包含因子2、3和5的數(根據已知求到結果,再把這個結果當成已知,求下乙個結果)2 //醜數
3 //把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。
4 //
5 //---常規思想---
6 //逐個判斷每個整數是不是醜數的解法,直觀但不夠高效
7 //所謂乙個數m是另乙個數n的因子,是指n被m整除,也就是n%m==0。根據醜數的定義,醜數只能被2、3、5整除。
也就是說如果乙個數能被2整數,我們把他連續除以2;如果能被3整出,就將其連續除以3.
如果能5整出,就將其連續除以5.如果得到的結果是1,則這個數就是醜數。
8 class solution
9 17 int result = 0;
18 int i = 1;
19 while( i< index)
20
26 }
27 return result;
28 }
29 public:
30 bool isuglynumber(int number)
31
36 while(number % 3 == 0)
37
40 while( number % 5 == 0)
41
44 return (number == 1)? true:false;
45 }
46 };
47 //-------建立陣列儲存已經找到的醜數,用空間換時間
48 //根據醜數的定義,醜數應該是另乙個醜數乘以2、3、5的結果(1除外)。
49 //因此建立乙個陣列,裡面的數字是排好序的醜數,每乙個醜數都是前面的醜數乘以2、3、5得到的。
50 //假設陣列中已經有若干個排好序的後存放在陣列中,並且把已有最大的醜數記作m,分析如何生成下乙個醜數。
51 //該醜數一定是前乙個醜數乘以2、3、或者5的結果。
52 //由於是按照順序生成的,小於或者等於m肯定已經在陣列中,我們不需要再次考慮,還會得到若干個大於m的結果,
但我們只需要第乙個大於m的結果,因為我們希望醜數是按照從小到大的順序生成的。
53 //把得到乙個乘以2大於m的結果記為m2,把已有每乙個醜數分別乘以3、5,能得到第乙個大於m的結果m3和m5。那麼下乙個醜數應該是m2、m3、m5中的最小者。
54 class solution
55 64 vectortmpvec(index);//分配容器大小,並初始化為0
65 tmpvec[0] = 1;
66 int i = 1;
67 int t2 = 0, t3 = 0, t5 = 0;
68 while(i < index)
69
75 if (tmpvec[i] == tmpvec[t3]*3)
76
79 if (tmpvec[i] == tmpvec[t5]*5)
80
83 ++i;
84 }
85 return tmpvec[index-1];
86 }
87 };
33醜數 只包含因子2 3和5的數
1 醜數 只包含因子2 3和5的數 根據已知求到結果,再把這個結果當成已知,求下乙個結果 2 醜數3 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。4 5 常規思想 6 逐...
醜數(因子只有 2 3 5 的數)
理解題意關鍵 如果說乙個數的因子只有 2 3 5 那麼反過來想,這個數一定是由若干個 2 3 5 相乘得到的,所以每一次只需要找出當前所有已知醜數中由2 3 5 相乘可以得到的最小的數即可。也就是說每乙個醜數,都可以由之前的醜數乘 2 3 5 得到。具體做法 設定三個指標,初始他們都指向第乙個醜數 ...
只包含因子2 3 5的數
k的因子中只包含2 3 5。滿足條件的前10個數是 2,3,4,5,6,8,9,10,12,15。所有這樣的k組成了乙個序列s,現在給出乙個數n,求s中 給定數的最小的數。例如 n 13,s中 13的最小的數是15,所以輸出15。input 第1行 乙個數t,表示後面用作輸入測試的數的數量。1 t ...