题目描述
- 我们把只包含因子 2,3,5 的数称做丑数(Ugly Number)
- 求按照从小到大的顺序的第 1500 个丑数
- 例如,6, 8都是丑数,但 14 不是,因为它包含因子 7
- 习惯上我们把 1 当作第一个丑数
题目解读
- 剑指Offer 240
- 思路一,常规普通方式,时间太长啦
- 思路二,书上
代码
#include<iostream>
using namespace std;
class Solution {
public:
bool is_Ugly_Number(int number){
bool flag = true;
while(number%2 == 0){
number = number/2;
}
while(number%3 == 0){
number = number/3;
}
while(number%5 == 0){
number = number/5;
}
if (number != 1){
flag = false;
}
return flag;
}
int GetUglyNumber_Solution(int index) {
if (index <= 0){
return 0;
}
int tt = 1;
int len = 0;
while(len != index){
if(is_Ugly_Number(tt)){
len ++;
}
tt ++;
}
return tt;
}
};
int main()
{
Solution ss;
cout<<ss.GetUglyNumber_Solution(15);
}
#include<iostream>
using namespace std;
class Solution {
public:
int Min_Number(int number1, int number2, int number3){
int mi = (number1 < number2)? number1:number2;
return (mi < number3)? mi:number3;
}
int GetUglyNumber_Solution(int index) {
if (index <= 0){
return 0;
}
int *uglyNumber = new int[index];
uglyNumber[0] = 1;
int *p2 = uglyNumber;
int *p3 = uglyNumber;
int *p5 = uglyNumber;
int next = 1;
while(next < index){
int mi = Min_Number(*p2 * 2, *p3 * 3, *p5 * 5);
uglyNumber[next] = mi;
while(*p2 * 2 <= uglyNumber[next]){
p2 ++;
}
while(*p3 * 3 <= uglyNumber[next]){
p3 ++;
}
while(*p5 * 5 <= uglyNumber[next]){
p5 ++;
}
next ++;
}
// 输出丑数
// for (int i = 0; i < index; ++i){
// cout<<uglyNumber[i]<<" ";
// }
int ugly = uglyNumber[next - 1];
delete[] uglyNumber;
return ugly;
}
};
int main(){
Solution ss;
cout<<ss.GetUglyNumber_Solution(15);
}
总结展望