东方博宜OJ 1138:求无暇素数

​【题目来源】
https://oj.czos.cn/p/1138

【题目描述】
一个两位整数 A 本身是素数,若将其个位数字与十位数字交换,得到一个新的两位数 B,而 B 也是素数,我们则称 A 为无暇素数。
例如:31 是素数,个位数字与十位数字交换后得到 13,也是素数。所以 31 是无暇素数。
问题:给出一个数字字符串(即字串中的字符全部由数字组成),求出其所有长度为 2 的子串组成的无暇素数。

【输入格式】
一个数字字符串(长度<20),以"%"结束。

【输出格式】
全部的无暇素数,之间用一个逗号隔开。​​​​​​​

【输入样例】
321314%​​​​​​​

【输出样例】
13,31

【数据范围】
数字字符串(长度<20)

【算法分析】
● 判断素数的经典代码

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

● 本题使用的一种格式化输出的代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin>>n;
    bool first=true;
    for(int i=1; i<=n; i++) {
        if(!first) cout<<",";
        cout<<i;
        first=false;
    }

    return 0;
}

/*
in:5
out:1,2,3,4,5
*/

● 注意:数字与字符之间的转换方法。例如:'7'-'0'=7,7+'0'='7'。

【算法代码】

#include <bits/stdc++.h>
using namespace std;

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

int main() {
    string s;
    cin>>s;
    bool first=true;
    for(int i=0; i<s.size()-2; i++) {
        int a=(s[i]-'0')*10+(s[i+1]-'0');
        int b=(a%10)*10+a/10;
        if(isPrime(a) && isPrime(b)) {
            if(!first) cout<<",";
            cout<<a;
            first=false;
        }
    }
    return 0;
}

/*
in:321314%
out:13,31
*/



【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/163876393

 

​

posted @ 2026-08-22 05:54  Triwa  阅读(21)  评论(0)    收藏  举报