题目:我们把只包含因子 2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但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); }