zoukankan      html  css  js  c++  java
  • Project Euler Problem 41 Pandigital prime

    Pandigital prime

    Problem 41

    We shall say that an n-digit number is pandigital if it makes use of all the digits 1 ton exactly once. For example, 2143 is a 4-digit pandigital and is also prime.

    What is the largest n-digit pandigital prime that exists?


    C++(Faster):

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    const int N = 9;
    
    int val[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int v[N];
    
    inline long getval(int n)
    {
        long value = 0;
        for(int i=n; i<N; i++) {
            value *= 10;
            value += val[i];
        }
    
        prev_permutation(val + n, val + N);
    
        return value;
    }
    
    inline bool isprime(long n)
    {
        if(n % 2 == 0)
            return false;
    
        long end = sqrt(n);
    
        for(int i=3; i<=end; i+=2)
            if(n % i == 0)
                return false;
    
        return true;
    }
    
    int main()
    {
        // 1+2+3+4+5+6+7+8+9 = 45 = 3 * 15  x=3k not is prime
        // 1+2+3+4+5+6+7+8 = 36 = 3 * 12
        // 1+2+3+4+5+6 = 21 = 3 * 7
        // 1+2+3+4+5 = 15 = 3 * 5 
        // 1+2+3 = 6 = 3 * 2
        // 1+2 = 3 = 3 * 1
        
        long value, max;
        int digits[] = {N-7, N-4};
    
        for(int i=0; i<2; i++) {
            max = value = getval(digits[i]);
            for(;;) {
                if(isprime(value)) {
                    cout << value << endl;
                    i = N;
                    break;
                } else {
                    value = getval(digits[i]);
                    if(value == max)
                        break;
                }
            }
        }
    
        return 0;
    }



    C++(Simpler):

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    const int N = 9;
    
    int val[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int v[N];
    
    inline long getval(int n)
    {
        long value = 0;
        for(int i=n; i<N; i++) {
            value *= 10;
            value += val[i];
        }
    
        prev_permutation(val + n, val + N);
    
        return value;
    }
    
    inline bool isprime(long n)
    {
        if(n % 2 == 0)
            return false;
    
        long end = sqrt(n);
    
        for(int i=3; i<=end; i+=2)
            if(n % i == 0)
                return false;
    
        return true;
    }
    
    int main()
    {
        long value, max;
    
        for(int i=0; i<N; i++) {
            max = value = getval(i);
            for(;;) {
                if(isprime(value)) {
                    cout << value << endl;
                    i = N;
                    break;
                } else {
                    value = getval(i);
                    if(value == max)
                        break;
                }
            }
        }
    
        return 0;
    }


    C++:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    const int N = 9;
    
    int val[] = {9, 8, 7, 6, 5, 4, 3, 2, 1};
    int v[N];
    
    inline void copyval(int n)
    {
        for(int i=n; i<N; i++)
            v[i] = val[i];
    }
    
    inline long getval(int n)
    {
        long value = 0;
        for(int i=n; i<N; i++) {
            value *= 10;
            value += v[i];
        }
    
        prev_permutation(v + n, v + N);
    
        return value;
    }
    
    inline bool isprime(long n)
    {
        if(n % 2 == 0)
            return false;
    
        long end = sqrt(n);
    
        for(int i=3; i<=end; i+=2)
            if(n % i == 0)
                return false;
    
        return true;
    }
    
    int main()
    {
        long value, max;
    
        for(int i=0; i<N; i++) {
            copyval(i);
    
            max = value = getval(i);
            for(;;) {
                if(isprime(value)) {
                    cout << value << endl;
                    i = N;
                    break;
                } else {
                    value = getval(i);
                    if(value == max)
                        break;
                }
            }
        }
    
        return 0;
    }



  • 相关阅读:
    GNU make manual 翻译( 一百五十)
    [导入]Google开发者日见闻 王开源现身
    [导入]微软中国原高管宫力就任火狐中国总经理
    [导入]QQTalk Beta1 简体中文版
    [导入]《南方都市报》:国产龙芯产业化 难
    [导入][多图]Nokia正式发布奢华8600/6500双子手机
    [导入]用户界面设计的技巧与技术
    [导入]BitComet(比特彗星) 0.89
    [导入]µTorrent 1.7 beta 2248
    今天我注册了
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563995.html
Copyright © 2011-2022 走看看