POJ-1338-Ugly Numbers-丑数

本文介绍了一种寻找Ugly Number的算法实现。Ugly Number是指只包含质因数2、3和5的正整数。文章通过一个具体的C++代码示例详细解释了如何生成这些数字,并提供了一个迭代解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

去年十二月份就已经做过了这道题。当时只是做出来,还来还没有完全理解。这不,三个月后的今天,竟忘记了。这两天看到不少面试题都喜欢拿这道题提问,于是,我便重新看了以前写的代码。

其实理解应该不算太难。就是一个数列,里面的数的因子只有2,3,5,并且这个数列按照从小到大的顺序排列。

设ugly[]数组保存这个数列,这样,可以设三个指针p2,p3,p5,分别指向数列中的三个数(可以相同),取ugly[p2],ugly[p3],ugly[p5]中的最小者作为下一个数,并将该所对应的指标加1。不断重重该过程,直到求出第N个数为止。

#include <iostream> using namespace std; const int MAX_POS = 1500; /*返回三者的最小值*/ int myMin(int a, int b, int c) { int min; min = a < b ? a : b; min = min < c ? min : c; return min; } int main() { int ugly[MAX_POS + 1]; ugly[1] = 1; int p2, p3, p5; p2 = p3 = p5 = 1; /*先求出MAX_POS个ugly number*/ for(int i = 2; i <= MAX_POS; i++) { int value2 = ugly[p2] * 2; int value3 = ugly[p3] * 3; int value5 = ugly[p5] * 5; ugly[i] = myMin(value2, value3, value5); /*使用最小那个ugly number的下标加1*/ if(ugly[i] == value2) p2++; if(ugly[i] == value3) p3++; if(ugly[i] == value5) p5++; } int n; while(cin >> n, n != 0) { cout << ugly[n] << endl; } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值