求1500个因数是2、3、5的数

求第1500个因数只有2、3、5的数。 数按照从小到大的顺序排列。其中1,2,3,4,5,6,8,9,10都属于这类数。

即求 Y = 2^x * 3^y * 5^z   (2的x次幂 乘以 3的y次幂 乘以 5的z次幂)的第1500个值。

这个思路很多人乍一看就会用枚举发去求,这样效率会比较低。 下面是一种网上很流行的效率比较高的算法。编程语言c++



#include "stdafx.h"
#include 
#include 

using namespace std;
#define COMPSITE_NUMBER 1500

long Min(const long v1, const long v2,  long v3);

int Count235(const int n, long res[])
{
	// give a value to first res[]
	res[0] = 1;
	// define three index variables: p2, p3, p5
	int p2 = 0;
	int p3 = 0;
	int p5 = 0;

	// Get every value which prime is only 2, 3 or 5.
	for (int i = 1; i < n; i++)
	{
		long r2 = res[p2] * 2;
		long r3 = res[p3] * 3;
		long r5 = res[p5] * 5;

		long minV = Min(r2, r3, r5);
		
		if (r2 <= minV)
		{
			p2++;
		}

		if (r3 <= minV)
		{
			p3++;
		}

		if (r5 <= minV)
		{
			p5++;
		}
		res[i] = minV;	
	}


	return 0;
}

// Compare three input values.  And return the minimum value
long Min(const long v1, const long v2,  long v3)
{
	long minValue = (v1 <= v2) ? v1 : v2;
	minValue = (minValue <= v3) ? minValue : v3;

	return minValue;
}



int main()
{
	if (COMPSITE_NUMBER < 1)
	{
		return -1;
	}

	long res[COMPSITE_NUMBER];
	int reV = Count235(COMPSITE_NUMBER, res);

	cout << "The value is: " 
		 << res[COMPSITE_NUMBER - 1] << endl;

	// the 1500 number value is : 859963392

	return 0;
}





算法解析:


Y = 2^P2 * 3^ P3 * 5^P5

0,  P2= 0; P3 = 0; P5 = 0;     Y[0]= 2^0 * 3^ 0* 5^0 = 1    

1, Y[1]= 2^1 * 3^ 0 * 5^0 = 2   = Y0 *2 = Y[P2] *2     (P2++) : P2 = 1; P3 = 0; P5 = 0;

2, Y[2]= 2^0 * 3^ 1 * 5^0 = 3   = Y0 *3= Y[P3] *3     (P3++): P2 = 1; P3 = 1; P5 = 0;

3, Y[3] = 2^2 * 3^ 0 * 5^0 = 4  = Y1 * 2= Y[P2] *2    (P2++): P2 = 2;P3 = 1; P5 = 0;

4, Y[4] = 2^0 * 3^ 0 * 5^1 = 5  = Y0 * 5= Y[P5] *5    (P5++): P2 = 2; P3 = 1; P5 =1

5, Y[5]= 2^1 * 3^ 1 * 5^0 = 6   = Y1 *3= Y[P3] *2 = Y[P2] *2  (P3++, p2++): P2 =3; P3 = 2; P5 = 1;  

6,Y[6]= 2^3 * 3^ 0 * 5^0 = 8   = Y3 *2 = Y[P2] *2     (P2++):  P2 = 4; P3 = 2;P5 = 1;

7, Y[7] = 2^0 * 3^ 2* 5^0 = 9   = Y2 *3=Y[P3]*3       (P3++): P2 = 4; P3 = 3; P5 = 1;

8, Y[8] = 2^1* 3^ 0 * 5^1= 10  =Y1 * 5 = Y[P5]*5     (P5++):P2 = 4; P3 = 3; P5 =2

9, Y[9]= 2^2 * 3^ 1 * 5^0 = 12  =Y4 *2 = Y[P2]*2    (P2++):P2 = 5;P3 = 3;P5 = 2;

接下去是以此类推。从而总结出了该算法中的规律。 非常有技巧性。








你可能感兴趣的:(c++/c)