一、判断一个数是不是丑数
三个循环,先除2,再除3,再除5,每当有余数就跳出循环,找出丑数中所有和2,3,5,有关的因子,如果最后结果为1,则为丑数。
注:非正数不是丑数,1是第一个丑数。
二、 判断第N个丑叔是几
创建一个数组存储丑数,声明三个指针分别代表因子2,3,5,并指向该数组。
先找出因子2,3,5自乘中最小的数,然后三个数组各自乘以各自的因子,当运算结果不大于当前丑叔时,指向自己数组的下一个元素(因为指针指向丑数数组,所以该元素为已经找到了前某个丑数,会跳过非丑数),直至找到第N个丑数。
AC代码
int nthUglyNumber1(int n) {
int *uglys = new int[n];
uglys[0] = 1;
int *p2 = uglys, *p3 = uglys, *p5 = uglys, next = 1;
while (next<n){
int m = min(min(*p2 * 2, *p3 * 3), *p5 * 5);
uglys[next] = m;
while (*p2 * 2 <= m)
*p2++;
while (*p3 * 3 <= m)
*p3++;
while (*p5 * 5 <= m)
*p5++;
next++;
}
int rst = uglys[n - 1];
delete[] uglys;
return rst;
}