面试题34:丑数

来源:互联网 发布:windows系统盘怎么安装 编辑:程序博客网 时间:2024/06/11 20:04
/*题目:把只包含因子2、3和5的数称作丑数,求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含7.习惯上我们把1当做第一个丑数。*/#include <iostream>using namespace std;//得到三个数中的最小数int Min(int number1, int number2, int number3){    int min = (number1 < number2) ? number1 : number2;    min = (min < number3) ? min : number3;    return min;}//将所得丑数从小到大排列到一个数组中(利用空间换时间)int GetUglynumber(int index){    if(index <= 0)    return 0;    int *pGetUglynumbers = new int [index];    //相关初始化    pGetUglynumbers[0] = 1;    int pNextUglyIndex = 1;    int *pMultiply2 = pGetUglynumbers;    int *pMultiply3 = pGetUglynumbers;    int *pMultiply5 = pGetUglynumbers;    //循环判断直至找到想要的丑数    while(pNextUglyIndex < index)    {        int min = Min((*pMultiply2) * 2, (*pMultiply3) * 3, (*pMultiply5) * 5);        //存储下一个丑数        pGetUglynumbers[pNextUglyIndex] = min;        while((*pMultiply2) * 2 <= pGetUglynumbers[pNextUglyIndex])        ++pMultiply2;        while((*pMultiply3) * 3 <= pGetUglynumbers[pNextUglyIndex])        ++pMultiply3;        while((*pMultiply5) * 5 <= pGetUglynumbers[pNextUglyIndex])        ++pMultiply5;        ++pNextUglyIndex;    }    int ugly = pGetUglynumbers[pNextUglyIndex - 1];    delete [] pGetUglynumbers;    return ugly;}//=================第二种方法===================bool IsUglyNumber(int number){    while(number % 2 == 0)    number /= 2;    while(number % 3 == 0)    number /= 3;    while(number % 5 == 0)    number /= 5;    return (number == 1) ? true : false;}//由于需要计算每一个数所以时间效率不高int GetUglynumber2(int index){    if(index <= 0)    return 0;    int Uglycount = 0;    int number = 0;    while(Uglycount < index)    {        number++;        if(IsUglyNumber(number))        {            Uglycount++;        }    }    return number;}//================测试代码======================void Test(int index, int expected){    if(GetUglynumber(index) == expected)    cout << "Passed!" << endl;    else    cout << "Failed!" << endl;    //第二种方法    if(GetUglynumber2(index) == expected)    cout << "2Passed!" << endl;    else    cout << "2Failed!" << endl;}int main(){    Test(1, 1);    Test(2, 2);    Test(3, 3);    Test(4, 4);    Test(5, 5);    Test(6, 6);    Test(7, 8);    Test(8, 9);    Test(9, 10);    Test(10, 12);    Test(11, 15);    Test(1500, 859963392);    Test(0, 0);    return 0;}

原创粉丝点击