1 条题解
-
1
题目分析
题意简述
丑数是指质因数仅为 、 或 的数,按照惯例, 也被视为丑数。给定一个正整数 (),需要找出并输出第 个丑数。当输入的 为 时,程序结束。
输入
输入包含多组数据,每组数据为一个正整数 (),当输入 时,输入结束。
输出
对于每组非零的 ,输出第 个丑数。
解题思路
动态规划思想
可以采用动态规划的方法来生成丑数序列。由于丑数只能由已有的丑数乘以 、 或 得到,我们可以维护三个指针 、 和 ,分别表示乘以 、 和 能得到下一个丑数的当前丑数的位置。
状态转移
- 初始化第一个丑数 。
- 对于第 个丑数,它是 、 和 中的最小值。
- 若 等于 ,则将 指针向后移动一位;若等于 ,则将 指针向后移动一位;若等于 ,则将 指针向后移动一位。
代码实现
//POJ1338 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define MAXN 1510 using namespace std; int biao[MAXN + 5]; void makeprime() { biao[1] = 1; int num2 = 1, num3 = 1, num5 = 1; for(int i = 2;i <= 1510; i ++) { biao[i] = min(biao[num2] * 2, min(biao[num3] * 3, biao[num5] * 5)); if(biao[i] == biao[num2] * 2) num2 ++; if(biao[i] == biao[num3] * 3) num3 ++; if(biao[i] == biao[num5] * 5) num5 ++; } } int main() { makeprime(); int n; while(scanf("%d", &n) != EOF, n) { printf("%d\n", biao[n]); } return 0; }
代码说明
- 全局数组:
biao[MAXN + 5]
用于存储丑数序列,其中biao[i]
表示第 个丑数。 makeprime
函数:- 初始化
biao[1] = 1
,因为 是第一个丑数。 - 初始化三个指针 、 和 都为 。
- 通过循环从第 个丑数开始生成,每次取 、 和 中的最小值作为第 个丑数。
- 根据生成的丑数更新相应的指针。
- 初始化
main
函数:- 调用
makeprime
函数生成丑数序列。 - 使用
while
循环读取输入的 ,当 不为 时,输出biao[n]
,即第 个丑数。
- 调用
通过以上步骤,我们可以高效地生成丑数序列并输出指定位置的丑数。
- 1
信息
- ID
- 339
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者