// Problem 41// 11 April 2003//// We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital and is also prime.//// What is the largest n-digit pandigital prime that exists?#include <iostream>#include <windows.h>#include <ctime>using namespace std;//************************************// Method: IsPandigital// FullName: IsPandigital// Describe: 檢查num是否為Pandigital// Access: public// Returns: bool// Qualifier:// Parameter: int num//************************************bool IsPandigital(int num, int n){ bool exsitDigit[9] = {false};//位bit,用於記錄存在的位 int currentDigit = 0; while(num != 0) { currentDigit = num % 10; if(currentDigit == 0)//含0,不符合要求 { return false; } if(currentDigit > n)//數字大於當前位元,不符合要求 { return false; } if(exsitDigit[currentDigit - 1])//已存在這個數字 { return false; } exsitDigit[currentDigit - 1] = true;//記錄 num /= 10; } return true;}//************************************// Method: IsPrimeNum// FullName: IsPrimeNum// Describe: 判斷某數是否為素數// Access: public// Returns: bool// Qualifier:// Parameter: int num//************************************bool IsPrimeNum(int num){ if((num % 2 == 0 && num > 2) || num <= 1) { return false; } int sqrtNum = (int)sqrt((double)num); for(int i = 3; i <= sqrtNum; i += 2) { if(num % i == 0) { return false; } } return true;}//************************************// Method: F1// FullName: F1// Describe: 這個演算法比較糟糕,是最愚笨的遍曆,十分耗時// Access: public// Returns: void// Qualifier://************************************void F1(){ cout << "void F1()" << endl; LARGE_INTEGER timeStart, timeEnd, freq; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&timeStart); const int MAX_NUM = 987654321;//最大的Pandigital int numCount = 9;//當前數位位元 int nextDecrease = 100000000;//下個位元改變點 int result = 0;//找到的結果 //從大到小遍曆所有數 for(int i = MAX_NUM; i > 0; i -= 2) { //找到需要的數字 if(IsPandigital(i, numCount) && IsPrimeNum(i)) { result = i; break; } //位元改變 if(i < nextDecrease) { nextDecrease /= 10; --numCount; } } cout << "結果為:" << result << endl; QueryPerformanceCounter(&timeEnd); cout << "Total Milliseconds is " << (double)(timeEnd.QuadPart - timeStart.QuadPart) * 1000 / freq.QuadPart << endl; time_t currentTime = time(NULL); char timeStr[30]; ctime_s(timeStr, 30, ¤tTime); cout << endl << "By GodMoon" << endl << timeStr;}//主函數int main(){ F1(); return 0;}/*void F1()結果為:7652413Total Milliseconds is 148553By GodMoonWed Apr 11 12:58:45 2012*/