您的位置:首页 > 职场人生

poj1338 Ugly Numbers

2015-12-03 20:37 411 查看
题意:

定义一个丑数:只能由2, 3, 5作为因子组成;

题意就是找第n个丑数;

特别的, 1也是一个丑数;

理解:

这题是个面试题, 在校赛上见到了, 以前没做过;

之后看着题目数据很小, 而且受yick师兄引导,就打表过了;

今天看了正确的题解,于是就记录下来。

很明显的可以看出,后面的丑数一定是有前面的丑数得来;

因此,先自己算出前面几个已知数;

这里是9个;

num[n + 10] = {0, 1, 2, 3, 4, 5, 6, 8, 9, 10};

然后记t2, t3, t5;

t2 表示某数 * 2 大于 当前数的前一个数 的下标;

t3 表示某数 * 3 大于 当前数的前一个数 的下标;

t5 表示某数 * 5 大于 当前数的前一个数 的下标;

然后再对此三个数取小:num[t2] * 2, num[t3] * 3, num[t5] * 5;

那么这个数就是要求的那个数;

依次如此就能求出第n个了;

代码如下:

#include <cstdio>

#include <algorithm>

using namespace std;

#define ll long long

int main()
{
int num[1501] = {0, 1, 2, 3, 4, 5, 6, 8, 9, 10};
int t2 = 0, t3 = 0, t5 = 0;
for (int i = 10; i < 1501; ++i)
{
while (num[t2] * 2 <= num[i - 1]) ++t2;
while (num[t3] * 3 <= num[i - 1]) ++t3;
while (num[t5] * 5 <= num[i - 1]) ++t5;
num[i] = min(num[t2] * 2, min(num[t3] * 3, num[t5] * 5));
}
int n;
while (~scanf("%d", &n) && n)
{
printf("%d\n", num
);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  poj 面试题