题目描述
金蝉素数:是由1、3、5、7、9这5个奇数排列组成的5位素数,并且同时去掉它的最高位与最低位数字后得到的3位数还是素数(一次脱壳),同时去掉它的高2位与低2位数字后得到的1位数还是素数 (二次脱壳)。这个特征非常有趣,犹如金蝉脱壳之后依然还是金蝉。因此,这些神秘的素数被人们称为金蝉素数。如13597是素数,359是素数,5是素数,则13597是金蝉素数,请编程找出所有的金蝉素数,一行一个从小到大输出!
输入
无
输出
一行一个从小到大输出所有的金蝉素数
分析
题目中说13579是金蝉素数,是怎么判断的呢?
其实题目中已经告诉我们了
步骤 | 举例数据 | 是否是素数 |
---|---|---|
首先要判断一个五位数是素数 | 13579 | 是 |
然后去掉前后两个数字,再判断一遍是否是素数 | 357 | 是 |
最后再去掉前后两个数字,再判断一遍是否是素数 | 5 | 是 |
但如果像这样有一次不是素数就不行了:
步骤 | 举例数据 | 是否是素数 |
---|---|---|
首先要判断一个五位数是素数 | 13479 | 是 |
然后去掉前后两个数字,再判断一遍是否是素数 | 347 | 是 |
最后再去掉前后两个数字,再判断一遍是否是素数 | 4 | 否 |
所以,要判断3次
代码如下:
#include<bits/stdc++.h>
using namespace std;
bool isp(int x){//判断x是否是质数
if(x==1) return 0;
for(int i=2;i<=sqrt(x);i++){
if(x%i==0) return 0;
}
return 1;
}
bool is13579(int x){//判断x是否由13579 5个数据组成
int a[10]={0};
while(x!=0){
a[x%10]++;
x=x/10;
}
if(a[1]==1&&a[3]==1&&a[5]==1&&a[7]==1&&a[9]==1) return 1;
else return 0;
}
int main(){
for(int i=13579;i<=97531;i++){
int i1=i/10%1000;//i的中间三位
int i2=i/100%10;//i的中间一位
if(is13579(i)&&isp(i)&&isp(i1)&&isp(i2)) cout<<i<<"\n";
}
return 0;
}