Ugly Numbers
阿新 • • 發佈:2018-11-01
Ugly Numbers
題目連結:Ugly Numbers
題目概述:醜數就是因子僅能是2,3,5的數,另外規定1也是醜數。醜數“1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15…”。求第1500的醜數。
Input:
沒有輸入
Output:
The 1500'th ugly number is <number>.
解題思路:
一、從2開始迴圈依次判斷當前數是否是醜數(能被連續被2,3,5整除),然後用count統計1500次,輸出該數即可。
二、想辦法從上一個醜數推斷出下一個醜數,而不需要從1開始遍歷再判斷。從1開始的10個醜數分別為1,2,3,4,5,6,8,9,10,12。可以發現除了1以外,醜數都是由某個醜數*2或者*3或者*5得到的。如2是醜數1*2得到的,3是醜數1*3得到的,4是醜數1*4得到的,5是醜數1*5得到的,6是醜數2*3得到的……
具體演算法步驟:
(1)從第一個醜數1開始,求出1*2=2 ,1*3=3 ,1*5 = 5;
(2)取上面乘積中大於1的最小值2,作為第二個醜數(醜數是個遞增序列,所以第i+1個醜數一定比第i個醜數)
(3)求醜數2之前的醜數與2、3、5的乘積:1*2=2 ,1*3=3 ,1*5 = 5; 2*2 = 4; 2*3 = 6; 2*5 =10;
(4)取上面乘積中大於2的最小值3,作為第三個醜數
……
……
(i)取出醜數i之前的醜數分別與2、3、5的乘積
(i+1)取乘積中大於i的最小值作為醜數
(i+2)重複(i)(i+1)的步驟直到計數器等於N
最終程式碼:
#include <iostream>
#include <vector>
using namespace std;
int nthUglyNumber(int n);
int main(){
int result = nthUglyNumber(1500);
cout << "The 1500'th ugly number is "<<result<<"."<< endl;
}
int nthUglyNumber(int n) {
int a = 0, b = 0, c = 0;
vector <int> ans(n, 1);
for (int i = 1; i < n; i++) {
int cur = min(ans[a] * 2, min(ans[b] * 3, ans[c] * 5));
if (ans[a] * 2 == cur) a++;
if (ans[b] * 3 == cur) b++;
if (ans[c] * 5 == cur) c++;
ans[i] = cur;
}
return ans[n - 1];
}