醜數 只包含因子2 3和5的數

2021-09-01 10:43:42 字數 1867 閱讀 1381

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 ...