题目:Ugly Number
正数中质因子只有2,3,5的数被称为"丑数"。判断一个数是不是"丑数"。
例如前十个最小的丑数:1 2 3 4 5 6 8 9 10 12
思路:
合数能表示成质数的积的形式,所以,丑数必然是只有2,3,5的因子。
bool LeetCode::isUgly(int num){ for (size_t i = 2; i < 6 && num; i++){ while (!(num % i)) num /= i;//循环除以[2,6]的数,最后为1,则是丑数 } return num == 1; }
题目:Ugly Number II
找到第n个丑数。
思路:
从第一个丑数开始向上找,知道找到第n个。
由上面的分析可以知道,丑数只是有2,3,5的因子,所以可以用2,3,5分别乘以一个丑数来得到新的丑数。
按照这种方式从小到大的求丑数,就可以了。
int LeetCode::nthUglyNumber(int n){ if (n < 1)return 0; vector<int>uglys;//保存求出的丑数 uglys.push_back(1); uglys.push_back(2); uglys.push_back(3); uglys.push_back(4); uglys.push_back(5);//前5个丑数 if (n <= 5)return uglys.at(n - 1); int i2 = 2, i3 = 1, i5 = 1;//2,3,5分别乘以的uglys中的丑数的下标 n -= 5; while (n){//求出第n个跳出循环 int temp = min(uglys.at(i2) * 2, uglys.at(i3) * 3); temp = min(temp, uglys.at(i5) * 5);//找到最小的丑数 uglys.push_back(temp); //因为可能是这三个数中的两个或三个的到的乘积,所以不能用else if if (temp == uglys.at(i2) * 2)++i2;//判断是哪个2得到的新的丑数 if (temp == uglys.at(i3) * 3)++i3;//判断是哪个3得到的新的丑数 if (temp == uglys.at(i5) * 5)++i5;//判断是哪个5得到的新的丑数 --n; } return uglys.at(uglys.size() - 1); }