现在的位置: 首页 > 综合 > 正文

64 寻找丑数

2018年05月02日 ⁄ 综合 ⁄ 共 872字 ⁄ 字号 评论关闭

64.  寻找丑数。
题目:我们把只包含因子 2、3  和 5  的数称作丑数(Ugly Number)。例如 6、8  都是丑数,
但 14  不是,因为它包含因子 7。习惯上我们把 1  当做是第一个丑数。求按从小到大的顺序
的第 1500  个丑数。
分析:这是一道在网络上广为流传的面试题,据说 google  曾经采用过这道题。

/*
64.  寻找丑数。
题目:我们把只包含因子 2、3  和 5  的数称作丑数(Ugly Number)。例如 6、8  都是丑数,
但 14  不是,因为它包含因子 7。习惯上我们把 1  当做是第一个丑数。求按从小到大的顺序
的第 1500  个丑数。
分析:这是一道在网络上广为流传的面试题,据说 google  曾经采用过这道题。
*/
#include<iostream> 
#include<stdio.h>  
using namespace std;   
int ugly[2000];
     
int Min(int a, int b)   
{    
    return a<b?a:b;   
}  
 
void FindUgly(int n)
{   
    
    ugly[0]=1;   
    int index2 = 0;   
    int index3 = 0;   
    int index5 = 0;   
    int index = 1;   
    while (index<=n)   
    {   
        int val=Min(Min(ugly[index2]*2,ugly[index3]*3),ugly[index5]*5); //竞争产生下一个丑数   
        if (val==ugly[index2]*2) //将产生这个丑数的index*向后挪一位;  
            ++index2;   //这里不能用elseif,因为可能有两个最小值,这时都要挪动;
        if (val==ugly[index3]*3)   
            ++index3;   
        if (val==ugly[index5]*5)   
            ++index5;   
        ugly[index++]=val;   
    }   
}   
 
int main()   
{   
    int num=1;
    
    FindUgly(1500);
    while(1)
    {
    	printf("input the number(0 end): \n");
		scanf("%d", &num);
		if(num==0) break;
    	printf("%d \n",ugly[num]); 	
    }
    return 0;   
}

抱歉!评论已关闭.