回文质数c++刚需求解

【问题描述】

因为373既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。请你写一个程序来找出范围[a,b](5 <= a < b <= 1000,0)间的所有回文质数。

输入:一行,表示区间a,b。

输出:回文质数列表,一行一个。

【样例输入】

5 300

【样例输出】

5

7

11

101

131

151

181

191

回文质数其实就是 回文数判断+质(素)数筛 两个的结合
所以下面的写法思路是先找出所有的回文数再判断它们是不是质数(素数)。

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
bool c[100000005];//bool类型 值只有0和1两种情况
//素数
void prime(int b) {
    memset(c, true, sizeof(c));
    c[1]=false;
    int n=sqrt(b);
    for (int i=2;i<=n;i++)
    {
        if (c[i]) 
        {
            for (int j=2;j<=b/i;j++)
                c[i*j]=false;
        }
    }
}
//回文数判断
bool hws(int num) {
    int temp=num,ans=0;
    while (temp!=0) 
    {
        ans=ans*10+temp%10;
        temp/=10;
    }
    if (ans==num)
        return true;
    else
        return false;
}
 //主函数
int main() {
    int a,b;
    cin>>a>>b;
    if (b>=10000000)
        b=9999999;
     prime(b);
     if(a>b)
        return 0;
     for (int i=a;i<=b;i+=2) {
        if (c[i] && hws(i))
            cout<<i<<endl;
    }
    return 0;
}

运行结果如图:

以上仅供参考,如有任何疑问,可以评论回复,看到即回。
希望对题主有所帮助!可以的话,帮忙点个采纳!

范围很小啊,直接暴力算法就行了


#include <iostream>
using namespace std;

int a[4];

bool func1(int n) {
    int count = 0;
    while(n) {
        a[count++] = n % 10;
        n /= 10;
    }
    for(int i = 0; i < count/2; i++) {
        if(a[i] != a[count-1-i]) return false;
    }
    return true;
}

bool func2(int n){
    if(n < 2) return false;
    if(n == 2 || n == 3 || n == 5 || n == 7) return true;
    int i;
    for(i = 2; i * i <= n; i++){
        if(n % i == 0) return false;
    }
    return true;
}

int main() {
    int a,b;
    cin>>a>>b;
    for(int i = a; i <= b; i++) {
        if(func1(i) && func2(i)) cout<<i<<endl;
    }
    return 0;
}

有用记得采纳哟