/*
对于每一个质数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");
}
*/
poj 1338 Ugly Numbers
最新推荐文章于 2025-08-12 21:47:50 发布