欢迎光临
我们一直在努力

东方博宜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  

赞(0)
未经允许不得转载:171主机测评 » 东方博宜OJ 1138:求无暇素数
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址