就是能被分解成2,3,5,7的数就是丑数啦。
#define MAX 99999 //数组最大值
int uglyNum(int n) {
int uglys[MAX] = {1}; //保存丑数数组
int count = 1; //因有一个数,所以从1开始
//1的情况另做判断
if (n == 1) {
return 1;
}
while (1) {
int chooseTwo = 0; //记录和2相乘的数据
int chooseThree = 0; //记录和3相乘的数据
int chooseFive = 0; //记录和5相乘的数据
for (int i = 0; i < count; i++) { //循环前面丑数和2相乘
if (uglys[i] * 2 > uglys[count - 1]) { //找到第一个大于前一个的丑数,直接记录然后break
chooseTwo = uglys[i] * 2;
break;
}
}
for (int i = 0; i < count; i++) { //和2同理
if (uglys[i] * 3 > uglys[count - 1]) {
chooseThree = uglys[i] * 3;
break;
}
}
for (int i = 0; i < count; i++) { //和2同理
if (uglys[i] * 5 > uglys[count - 1]) {
chooseFive = uglys[i] * 5;
break;
}
}
//比较三个数的大小,小的即为丑数,加入数组中
int temp = chooseTwo <= chooseThree ? chooseTwo : chooseThree;
uglys[count] = temp <= chooseFive ? temp : chooseFive;
//计数器加一
count++;
//如果是第n个就直接返回
if (count == n) {
//数组最后一个元素下标是count-1
return uglys[count - 1];
}
}
}