【ProjectEuler】ProjectEuler_041

來源:互聯網
上載者:User
// 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*/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.