프로젝트 오일러 47
projecteuler, cpp소인수분해 소스는 이미 한 번 만들었다. 오일러 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;
}