POJ-1338-Ugly Numbers-丑数

去年十二月份就已经做过了这道题。当时只是做出来,还来还没有完全理解。这不,三个月后的今天,竟忘记了。这两天看到不少面试题都喜欢拿这道题提问,于是,我便重新看了以前写的代码。

其实理解应该不算太难。就是一个数列,里面的数的因子只有2,3,5,并且这个数列按照从小到大的顺序排列。

设ugly[]数组保存这个数列,这样,可以设三个指针p2,p3,p5,分别指向数列中的三个数(可以相同),取ugly[p2],ugly[p3],ugly[p5]中的最小者作为下一个数,并将该所对应的指标加1。不断重重该过程,直到求出第N个数为止。

#include <iostream> using namespace std; const int MAX_POS = 1500; /*返回三者的最小值*/ int myMin(int a, int b, int c) { int min; min = a < b ? a : b; min = min < c ? min : c; return min; } int main() { int ugly[MAX_POS + 1]; ugly[1] = 1; int p2, p3, p5; p2 = p3 = p5 = 1; /*先求出MAX_POS个ugly number*/ for(int i = 2; i <= MAX_POS; i++) { int value2 = ugly[p2] * 2; int value3 = ugly[p3] * 3; int value5 = ugly[p5] * 5; ugly[i] = myMin(value2, value3, value5); /*使用最小那个ugly number的下标加1*/ if(ugly[i] == value2) p2++; if(ugly[i] == value3) p3++; if(ugly[i] == value5) p5++; } int n; while(cin >> n, n != 0) { cout << ugly[n] << endl; } return 0; }

你可能感兴趣的:(POJ-1338-Ugly Numbers-丑数)