64. 寻找丑数。
题目:我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,
但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序
的第 1500 个丑数。
分析:这是一道在网络上广为流传的面试题,据说 google 曾经采用过这道题。
/* 64. 寻找丑数。 题目:我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数, 但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序 的第 1500 个丑数。 分析:这是一道在网络上广为流传的面试题,据说 google 曾经采用过这道题。 */ #include<iostream> #include<stdio.h> using namespace std; int ugly[2000]; int Min(int a, int b) { return a<b?a:b; } void FindUgly(int n) { ugly[0]=1; int index2 = 0; int index3 = 0; int index5 = 0; int index = 1; while (index<=n) { int val=Min(Min(ugly[index2]*2,ugly[index3]*3),ugly[index5]*5); //竞争产生下一个丑数 if (val==ugly[index2]*2) //将产生这个丑数的index*向后挪一位; ++index2; //这里不能用elseif,因为可能有两个最小值,这时都要挪动; if (val==ugly[index3]*3) ++index3; if (val==ugly[index5]*5) ++index5; ugly[index++]=val; } } int main() { int num=1; FindUgly(1500); while(1) { printf("input the number(0 end): \n"); scanf("%d", &num); if(num==0) break; printf("%d \n",ugly[num]); } return 0; }