把只包含质因子2、3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数。
解法2:在当前丑数里乘以2,3,5,找到最小的后续丑数添加到序列里
写一个高效算法,返回第n个丑数。
解法1: 判断某个数是否为丑数,连续找到第n个丑数
#include <iostream>
using namespace std;
bool isUgly(int num){
if(num < 1)
return false;
if(num == 1)
return true;
while(num % 2 == 0)
num /= 2;
while(num % 3 == 0)
num /= 3;
while(num % 5 == 0)
num /= 5;
return num == 1;
}
int nthUgly(int n){
int index = 1, x = 2;
while(index < n){
if(isUgly(x)){
index++;
++x;
}
else
++x;
}
return x - 1;
}
int main(){
int n;
cout << "input the number n:\n";
cin >> n;
cout << nthUgly(n);
return 0;
}
解法2:在当前丑数里乘以2,3,5,找到最小的后续丑数添加到序列里
#include <iostream>
using namespace std;
int minOf3(int a, int b, int c){
int temp = (a < b ? a : b);
return (temp < c ? temp : c);
}
long findUgly(int n){
int *ugly = new int[n];
ugly[0] = 1;
int index2 = 0, index3 = 0, index5 = 0;
int index = 1;
while(index < n){
int val = minOf3(ugly[index2] * 2, ugly[index3] * 3, ugly[index5] * 5);
ugly[index] = val;
while(val >= ugly[index2] * 2)
++index2;
while(val >= ugly[index3] * 3)
++index3;
while(val >= ugly[index5] * 5)
++index5;
index++;
}
cout << ugly[n - 1];
delete [] ugly;
return 0;
}
int main(){
int n;
cout << "input the number n:\n";
cin >> n;
findUgly(n);
return 0;
}