서로 다른 네 개의 소인수를 갖는 수들이 처음으로 네 번 연속되는 경우는?

[eng][kor]

소인수분해 소스는 이미 한 번 만들었다. 오일러 29번에서 가져다 써서 날로 먹으면 풀면 된다. 실행시간 4.065초.

/*
 	Problem 47 - Distinct primes factors 
*/
#include <stdlib.h>
#include <iostream>
#include <map>
#include <vector>
#include <cmath>
#include <ctime>

using namespace std;
struct _PrimeFactor
{
	int p; // prime number
	int e; // exponent
};
typedef struct _PrimeFactor PrimeFactor;

class PrimeFactors 
{
	private: 
		std::map<int, PrimeFactor> pf;
	public:
		PrimeFactors(int n, int e)
		{
			while( true)
			{
				if( n <= 1) break;
				for(int i=2; i<=n; i++)
				{
					if (n%i == 0) {
						n = n/i;
						std::map<int, PrimeFactor>::iterator it = pf.find(i);
						if (it!= pf.end()) {
							(it->second.e)++;
						} else {
							PrimeFactor p;
							p.p = i;
							p.e = 1;
							pf.insert( std::map<int,PrimeFactor>::value_type(i, p));
						}
						break;
					}
				}
			}

			for( std::map<int, PrimeFactor>::iterator it = pf.begin(); it != pf.end(); it++)
			{
				PrimeFactor *p = &(it->second);
				if (e <= 1) break;
				p->e = (p->e)*(e);
			}
		}

		void print()
		{
			for( std::map<int, PrimeFactor>::iterator it = pf.begin(); it != pf.end(); it++)
			{
				PrimeFactor *p = &(it->second);
				cout << p->p << "^" << p->e <<"*";
			}
			cout << endl;
		}

		int find( int p)
		{
			std::map<int,PrimeFactor>::iterator it = pf.find( p);
			if( it != pf.end()) {
				return (it->second).e;
			}
			return -1;
		}

		int npf() { return pf.size();}

		bool operator == ( PrimeFactors& rhs)
		{
			if( npf() != rhs.npf()) return false;
			for( std::map<int, PrimeFactor>::iterator it = pf.begin(); it != pf.end(); it++)
			{
				PrimeFactor *p = &(it->second);
				int e = rhs.find( p->p);
				if (e == -1 || e != p->e) { return false;}
			}
			return true; 
		}
};

bool hasFourPrimeFactors( int n)
{
	std::vector<PrimeFactors> p;
}

int main(int argc, char** argv)
{
	clock_t begin = clock();

	/* starting code */
	int i;
	int left = 4;
	while( true) {
		PrimeFactors p = PrimeFactors(i, 1);
		if (p.npf() == 4) {
			left--;
		} else {
			left = 4;
		}

		if( left == 0) break; 
		i++;
	}
	cout << "found first number =" << i-3 << endl;
	
	/* end of code */
	clock_t end = clock();
	std::cout << "elapsed time=" << double(end - begin) / CLOCKS_PER_SEC << std::endl;
	return 0;
}