#pragma once#include <windows.h>#include <vector>#include <set>using namespace std;class MoonMath{public: MoonMath(void); ~MoonMath(void); //************************************ // Method: IsInt // Access: public // Describe: 判斷double值在epsilon的範圍內是否很接近整數 // 如1.00005在epsilon為0.00005以上就很接近整數 // Parameter: double doubleValue 要判斷的double值 // Parameter: double epsilon 判斷的精度,0 < epsilon < 0.5 // Parameter: INT32 & intValue 如果接近,返回最接近的整數值 // Returns: bool 接近返回true,否則返回false //************************************ static bool IsInt(double doubleValue, double epsilon, INT32 &intValue); //************************************ // Method: Sign // Access: public // Describe: 擷取value的符號 // Parameter: T value 要擷取符號的值 // Returns: INT32 正數、0和負數分別返回1、0和-1 //************************************ template <typename T> static INT32 Sign(T value); //************************************ // Method: IsPrimer // Access: public // Describe: 判斷一個數是否是素數 // Parameter: UINT32 num 要判斷的數 // Returns: bool 是素數返回true,否則返回false //************************************ static bool IsPrimer(UINT32 num); //************************************ // Method: IsIntegerSquare // Access: public static // Describe: 判斷給定的數開平方後是否為整數 // Parameter: UINT32 num // Returns: bool //************************************ static bool IsIntegerSquare(UINT32 num); //************************************ // Method: GetDiffPrimerFactorNum // Access: public static // Describe: 擷取num所有的不同質因數 // Parameter: UINT32 num // Returns: set<UINT32> //************************************ static set<UINT32> MoonMath::GetDiffPrimerFactorNum(UINT32 num);};
#include "MoonMath.h"#include <cmath>MoonMath::MoonMath(void){}MoonMath::~MoonMath(void){}template <typename T>INT32 MoonMath::Sign(T value){ if(value > 0) { return 1; } else if(value == 0) { return 0; } else { return -1; }}bool MoonMath::IsInt(double doubleValue, double epsilon, INT32 &intValue){ if(epsilon > 0.5 || epsilon < 0) { return false; } if(INT32(doubleValue + epsilon) == INT32(doubleValue - epsilon)) { return false; } INT32 value = INT32(doubleValue); intValue = (fabs(doubleValue - value) > 0.5) ? (value + MoonMath::Sign(doubleValue)) : (value) ; return true;}bool MoonMath::IsPrimer(UINT32 num){ // 0和1不是素數 if(num <= 1) { return false; } UINT32 sqrtOfNum = (UINT32)sqrt((double)num); // num的2次方 // 從2到sqrt(num),如果任何數都不能被num整除,num是素數,否則不是 for(UINT32 i = 2; i <= sqrtOfNum; ++i) { if(num % i == 0) { return false; } } return true;}bool MoonMath::IsIntegerSquare(UINT32 num){ UINT32 qurtNum = (UINT32)sqrt((double)num); return (qurtNum * qurtNum) == num;}set<UINT32> MoonMath::GetDiffPrimerFactorNum(UINT32 num){ UINT32 halfNum = num / 2; set<UINT32> factors; for(UINT32 i = 2; i <= halfNum; ++i) { if(!MoonMath::IsPrimer(i)) { continue; } if(num % i == 0) { factors.insert(i); while(num % i == 0) { num /= i; } } } return factors;}
// Distinct primes factors// Problem 47// The first two consecutive numbers to have two distinct prime factors are://// 14 = 2 * 7// 15 = 3 * 5//// The first three consecutive numbers to have three distinct prime factors are://// 644 = 2^2 * 7 * 23// 645 = 3 * 5 * 43// 646 = 2 * 17 * 19.//// Find the first four consecutive integers to have four distinct prime factors. What is the first of these numbers?#include <iostream>#include <windows.h>#include <ctime>#include <assert.h>#include <MoonMath.h>using namespace std;// 列印時間等相關資訊class DetailPrinter{public: void Start(); void End(); DetailPrinter();private: LARGE_INTEGER timeStart; LARGE_INTEGER timeEnd; LARGE_INTEGER freq;};DetailPrinter::DetailPrinter(){ QueryPerformanceFrequency(&freq);}//************************************// Method: Start// Access: public// Describe: 執行每個方法前調用// Returns: void//************************************void DetailPrinter::Start(){ QueryPerformanceCounter(&timeStart);}//************************************// Method: End// Access: public// Describe: 執行每個方法後調用// Returns: void//************************************void DetailPrinter::End(){ QueryPerformanceCounter(&timeEnd); cout << "Total Milliseconds is " << (double)(timeEnd.QuadPart - timeStart.QuadPart) * 1000 / freq.QuadPart << endl; const char BEEP_CHAR = '\007'; cout << endl << "By GodMoon" << endl << __TIMESTAMP__ << BEEP_CHAR << endl; system("pause");}/*************************解題開始*********************************/void TestFun1(){ cout << "Test OK!" << endl;}void F1(){ cout << "void F1()" << endl; // TestFun1(); DetailPrinter detailPrinter; detailPrinter.Start(); /*********************************演算法開始*******************************/ const UINT32 NUM_COUNT = 4; const UINT32 BEGIN_NUM = 1; UINT32 continueCount = 0; bool haveFound = false; UINT32 num; for(num = BEGIN_NUM; !haveFound; ++num) { if(MoonMath::GetDiffPrimerFactorNum(num).size() == NUM_COUNT) { ++continueCount; if(continueCount >= NUM_COUNT) { haveFound = true; break; } continue; } continueCount = 0; } if(haveFound) { cout << "The first num which have " << NUM_COUNT << " distinct prime factors is " << num - NUM_COUNT + 1 << endl; } else { cout << "Not Found!" << endl; } /*********************************演算法結束*******************************/ detailPrinter.End();}//主函數int main(){ F1(); return 0;}/*void F1()The first num which have 4 distinct prime factors is 134043Total Milliseconds is 679360By GodMoonMon Mar 11 21:00:03 2013*/