求一个区间内的所有回文素数

题目

思路

构造回文数,再判断是否为素数。

方法

构造回文数

产生长度为5的回文数

for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0; d3 <= 9; d3++) {
           palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
         }
     }
 }

减少范围的要点:

  • 1位回文素数只有5,7;2位回文素数只有11 。
  • 偶数长度的回文数一定能被11整除,所以除了11本身,其他偶数长度的回文数都不是素数。

判断是否为素数

bool isPrime(int n) {
    for(int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

C++代码实现

/**
 * 求一个区间内的回文素数,暴力解法
 */
#include <iostream>
using namespace std;

int isPrime(int n);

int main() {
    int a, b;
    cin >> a >> b;
    int palindrome;
    while (a) {
        // 枚举 1 位和 2 位的回文素数
        for (int i = 5; i < 12 && a < 12; i += 2 ) {
            if (i >= a && i <= b && isPrime(i))
                cout << i << endl;
        }

        // 枚举 3 位的回文素数
        for (int i = 1; i < 10 && a < 1000; i+=2) {
            for (int j = 0; j < 10; j++) {
                palindrome = i * 100 + j * 10 + i;
                if (palindrome >= a && palindrome <= b && isPrime(palindrome)) {
                    cout << palindrome << endl;
                }
                if (palindrome >= b) {
                    goto exit;
                }
            }
        }

        // 5
        for (int d1 = 1; d1 <= 9 && a < 100000; d1+=2) {
            for (int d2 = 0; d2 <= 9; d2++) {
                for (int d3 = 0; d3 <= 9; d3++) {
                    palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;
                    if (palindrome >= a && palindrome <= b && isPrime(palindrome)) {
                        cout << palindrome << endl;
                    }
                    if (palindrome >= b) {
                        goto exit;
                    }
                }
            }
        }

        // 7
        for (int d1 = 1; d1 <= 9; d1+=2) {
            for (int d2 = 0; d2 <= 9; d2++) {
                for (int d3 = 0; d3 <= 9; d3++) {
                    for (int d4 = 0; d4 <= 9; d4++) {
                        palindrome = 1000000*d1 + 100000*d2 +10000*d3 + 1000*d4 + 100*d3 + 10*d2 + d1;
                        if (palindrome >= a && palindrome <= b && isPrime(palindrome)) {
                            cout << palindrome << endl;
                        }
                        if (palindrome >= b) {
                            goto exit;
                        }
                    }
                }
            }
        }
        exit:
        cin >> a >> b;
    }
    return 0;
}

int isPrime(int n) {
    for(int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

猜你喜欢

转载自blog.csdn.net/For_course/article/details/86482415