pku-1338 Ugly Numbers
2010-06-05 16:48
316 查看
关于此题数列生成方法的思考:
1.考虑两个事实:如果f(k)在数列中,那么根据f(k)可以得到f(k)*2, f(k)*3, f(k)*5, 3个ugly Number。而f(k)最多可能由三个数生成,f(k)/2, f(k)/3, f(k)/5,如果f(k)是2,3,5的倍数。
2.设计3个生成器,初始值为f(1)=1,且增量分别为系数2,3,5;每次从3个生成器中选择最小的一个,加入到数列。生成器只有当生成的数被取走后才会生成下一个,所以可以保证
生成器中的3个数必有一个是符合条件的数。
代码
1.考虑两个事实:如果f(k)在数列中,那么根据f(k)可以得到f(k)*2, f(k)*3, f(k)*5, 3个ugly Number。而f(k)最多可能由三个数生成,f(k)/2, f(k)/3, f(k)/5,如果f(k)是2,3,5的倍数。
2.设计3个生成器,初始值为f(1)=1,且增量分别为系数2,3,5;每次从3个生成器中选择最小的一个,加入到数列。生成器只有当生成的数被取走后才会生成下一个,所以可以保证
生成器中的3个数必有一个是符合条件的数。
代码
//Type:归纳推导 #include <stdio.h> #include <string.h> #define MIN(x,y) ((x)<(y)?(x):(y)) int ug[1501]; void init() { int i; int i2, i3, i5; i2 = i3 = i5 = 1; ug[1] = 1; for (i=2; i<=1500; i++) { int t = MIN(ug[i2]*2, MIN(ug[i3]*3, ug[i5]*5)); ug[i] = t; if (t == ug[i2]*2) i2++; if (t == ug[i3]*3) i3++; if (t == ug[i5]*5) i5++; } } int main() { init(); int n; while (scanf("%d", &n) != EOF) { if (!n) break; printf("%d\n", ug ); } return 0; }
相关文章推荐
- pku_1338 Ugly Numbers
- PKU 1338 -- Ugly Numbers
- poj 1338 Ugly Numbers
- POJ 1338 ugly numbers
- POJ1338 Ugly Numbers
- poj 1338 Ugly Numbers
- poj 1338 Ugly Numbers
- POJ 1338 Ugly Numbers
- poj 1338 Ugly Numbers
- POJ - 1338 - Ugly Numbers
- POJ 1338 Ugly Numbers
- poj 1338 Ugly Numbers
- poj-1338-Ugly Numbers
- poj 1338 Ugly Numbers
- POJ-1338-Ugly Numbers
- problem 1338: ugly numbers
- poj 1338 Ugly Numbers
- POJ 1338 Ugly Numbers
- POJ 1338 - Ugly Numbers
- poj-1338-Ugly Numbers