寻找丑数

题目:我们把只包含因子 235的数称作丑数(Ugly Number)。例如68都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第100个丑数。

分析:请看如下图:

         index     index2(*2)    index3(*3)   index5(*5)        value

           0             0                     0                0                 1

           1             1                     0                0                min(2,3,5)=2

           2             1                     1                0                min(4,3,5)=3

           3             2                     1                0                min(4,2*3,5)=4

           4             2                     1                1                min(6,6,5)=5

           5             2                     1                2                min(6,6,10)=6

  ....

// 丑数.cpp : 定义控制台应用程序的入口点。

//



#include "stdafx.h"

#include <iostream>

using namespace std;



int FindMin(const int a,const int b,const int c)

{

    int min=(a<b?a:b);

    return (min<c?min:c);

}



void FindChoushu(const int number)

{

    if(number<=0)

        return;

    //一定要明确是按照由小到大的排序存储的,所以每次我们选择的是最小的;

    int index=0;

    int *Choushu_num=new int[number];

    Choushu_num[0]=1;  //先初始化;

    cout<<Choushu_num[0]<<endl;

    int index2=0;

    int index3=0;

    int index5=0;

    int min_Choushu=0;

    while (index<number-1)      //当把1当做第一个丑数的时候,需要把数组第一位已经占了一位了;

    {

        min_Choushu=FindMin( Choushu_num[index2]*2, Choushu_num[index3]*3, Choushu_num[index5]*5 );

        if (min_Choushu==Choushu_num[index2]*2)    //每次index2或者index3++或者index5++的时候,都伴随着其Choushu_num[index2(3,5)]的增加;

            index2++;

        if (min_Choushu==Choushu_num[index3]*3)

            index3++;

        if (min_Choushu==Choushu_num[index5]*5)

            index5++;

        Choushu_num[++index]=min_Choushu;  //记得++index;

        cout<<min_Choushu<<endl;

    }

    delete [ ]Choushu_num;

}

void main()

{

   FindChoushu(10);

}

 

        

你可能感兴趣的:(寻找丑数)