题目:寻找满足pow(2, i)*pow(3, j)*pow(5, k)的第n个数,其中ijk大于等于0,例如前11个数分别为:1 2 3 4 5 6 8 9 10 12 15。
分析:本题中ijk没有任何规律,最简单的办法也是最直接的办法,就是从1开始遍历每一个数,如果满足只有2、3、5作为质因子的就计数,计数到n就是所求的数。但是这个方法明显效率很低。
根据题意,前11个组成的数列为:1 2 3 4 5 6 8 9 10 12 15,仔细分析,第12个数必定满足只有2、3、5作为质因子,因此这个数一定要么是2*x,要么是3*y,要么是5*z,同时xyz也必须满足题中的条件,才能使它们的乘积也满足条件,题中列出了所有满足条件的值,因此只需要在当前数列中寻找xyz即可。当前数列的最后一个数是15,因此x至少要大于15/2也就是7,因此x=8,2*x=16;同样假设是3*y,则y=6,3*y=18;若是5*z,则z=4,5*z=20。
根据以上的分析可知,每次计算下一个数的时候只需要计算min(2x, 3y, 5z)即可,同时还需要更新2x, 3y, 5z。
代码实现:
int getNth( int n )
{
if ( n <= 0 )
return -1;
int a[3] = { 2, 3, 5 };
int b[18] = { 1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30 };
if ( n <= 18 )
return b[n-1];