题目来自剑指Offer
题目:
题目换句话说:丑数就是连续除以2,3,5,之后商为1的数.
代码:
bool IsUglyNum(int nNum) { //消除因子2 while (nNum % 2 == 0) { nNum /= 2; } //消除因子3 while (nNum % 3 == 0) { nNum /= 3; } //消除因子5 while (nNum % 5 == 0) { nNum /= 5; } if (nNum == 1) { return true; } else { return false; } }
题目思路:丑数乘以2,3,5后仍是丑数。
具体来说:根据现有丑数,每次扩展一个丑数。
(1)使用三个指针nCurOne,nCurTwo,nCurThree用来分别产生乘以2,3,5后的候选丑数。
(2)之后取三个候选丑数的最小值,作为本次扩展的丑数。
(3)让产生的候选丑数等于本次扩展丑数的指针都往前走一步。
注意:三个指针总是指向其待扩展的丑数。
代码:
#include <iostream> using namespace std; const int SIZE = 10000; int Min(int x,int y,int z) { if (x < y) { if (x < z) //y > x,z > x { return x; } else //y>x,x>=z { return z; } } else { if (z > y)//x > y { return y; } else //x>y,y>z { return z; } } } int UglyNum(int nIndex) { int nArrUgly[SIZE]; int nCurTwo = 0; int nCurThree = 0; int nCurFive = 0; int nCount = 1; int nCurUgly = 0x3f3f3f; nArrUgly[0] = 1; while (nCount < nIndex) { nCurUgly = Min(nArrUgly[nCurTwo] * 2,nArrUgly[nCurThree] * 3,nArrUgly[nCurFive] * 5); nArrUgly[nCount++] = nCurUgly; if (nArrUgly[nCurTwo] * 2 == nCurUgly) { nCurTwo++; } if (nArrUgly[nCurThree] * 3 == nCurUgly) { nCurThree++; } if (nArrUgly[nCurFive] * 5 == nCurUgly) { nCurFive++; } } return nCurUgly; } int main() { cout<<UglyNum(1500)<<endl; system("pause"); return 1; }