寻找丑数

题目:我们把只包含因子 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);
}

        

原文地址:https://www.cnblogs.com/menghuizuotian/p/3823941.html