poj 1338 Ugly Numbers

来源:互联网 发布:斗鱼大官人淘宝店网址 编辑:程序博客网 时间:2024/05/18 01:12
/*对于每一个质数2 3 5,我们都要找到对应的之前已经计算出的最小的丑数使之乘以这个质数后大于当前的丑数,然后再从这三个里取最小的那个,我们记录三个数a2,a3,a5,分别保存对应的质数计算到哪个下标了,然后更新所有质数对应的下标,使之乘积大于当前的丑数*/#include <iostream>#include <algorithm>using namespace std;long ugly_number[1505];int main(){    int i, n2, n3, n5;    ugly_number[1] = 1;    n2 = 1;    n3 = 1;    n5 = 1;        for (i = 2; i <= 1500; i++)    {        ugly_number[i] = min(ugly_number[n2] * 2, min(ugly_number[n3] * 3, ugly_number[n5] * 5));        if (ugly_number[i] == ugly_number[n2] * 2)           n2++;        if (ugly_number[i] == ugly_number[n3] * 3)           n3++;        if (ugly_number[i] == ugly_number[n5] * 5)           n5++;    }        int num;    while (cin >> num && num)       cout << ugly_number[num] << endl;           system("pause");}//tle的做法 /*#include <iostream>using namespace std;int ugly_number[1505];int main(){    int i, tmp, c;    ugly_number[1] = 1;    c = 2;    for (i = 2; ; i++)    {        tmp = i;        while (1)        {              if(tmp%2 == 0)                 tmp /= 2;              else if (tmp%3 == 0)                 tmp /= 3;              else if (tmp%5 == 0)                  tmp /= 5;              else break;        }        if (tmp == 1 || tmp == 2 || tmp == 3 || tmp == 5)        {            ugly_number[c] = i;            c++;        }        if (c > 1500)  break;    }        int num;    while (cin >> num && num)    {          cout << ugly_number[num] << endl;    }        system("pause");} */