寻找丑数
2014-08-08 16:19
302 查看
题目:我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 1500 个丑数。
思路:由2,3,5构造丑数,并且将已经构造好的排序,假设前n个已经是排好序的丑数,则下一个丑数,是前面所有的数*2,或*3,或*5的到的最小的数,*2得到的数有n个,但我们之用保留第一个大于数n的数,并记录下index2,下一次它的index2搜索也是从该索引之后就可以了,对于*3,*5都一样,记为index3,index5,这三个数分别是*2,*3,*5得到的大于目前第n个丑数的最小的数,所以从这三个数当中选择最小的数放在这个数组中,直到需要找的第1500个丑数。
以下为代码:
思路:由2,3,5构造丑数,并且将已经构造好的排序,假设前n个已经是排好序的丑数,则下一个丑数,是前面所有的数*2,或*3,或*5的到的最小的数,*2得到的数有n个,但我们之用保留第一个大于数n的数,并记录下index2,下一次它的index2搜索也是从该索引之后就可以了,对于*3,*5都一样,记为index3,index5,这三个数分别是*2,*3,*5得到的大于目前第n个丑数的最小的数,所以从这三个数当中选择最小的数放在这个数组中,直到需要找的第1500个丑数。
以下为代码:
int findUgly(int n) { int arr[1500] = {}; int i, j, index2=0, index3=0, index5=0; arr[0] = 1; int min; for (i = 1; i < n; i++) { j = index2; while (j <= i && arr[j]*2 <= arr[i-1]) j++; index2 = j; j = index3; while (j <= i && arr[j]*3 <= arr[i-1]) j++; index3 = j; j = index5; while (j <= i && arr[j]*5 <= arr[i-1]) j++; index5 = j; min = arr[index2]*2 < arr[index3]*3 ? arr[index2]*2 : arr[index3]*3; min = min < arr[index5]*5 ? min : arr[index5]*5; arr[i] = min; } return arr[n-1]; } int main() { int n; scanf("%d\n", &n); printf("第%d个丑数是:%d\n", n, findUgly(n)); return 0; }
相关文章推荐
- (19) 转载: 寻找丑数
- 寻找丑数
- 寻找丑数
- 寻找丑数
- 寻找丑数(ugly number)
- (剑指offer)丑数 寻找第一个只出现一次的字符
- 寻找丑数
- 寻找丑数(Ugly Number)
- 寻找丑数
- 寻找丑数
- 寻找丑数
- 剑指offer系列之三十二:寻找丑数
- 264.leetcode Ugly Number II(medium)[寻找第N个丑数]
- 算法学习笔记之寻找第1500个丑数
- 九度OJ 1214 寻找丑数【算法】
- 每日一道算法题-寻找丑数
- 寻找丑数,把只包含因子2、3和5的数称作丑数(Ugly Number)
- 2081 寻找丑数
- Ugly Number 寻找丑数 简单题
- 算法题3 寻找丑数&数值逼近