题目描述
在大于
1
1 的自然数中,除了
1
1 和它本身以外不再有其他因数的数,被称为素数,又叫质数。
超级素数是指一个素数,每去掉最后一位上一个数字,总能保证剩下的数依然为素数。比如:
373
373 就是一个超级素数,去掉个位的
3
3 后,
37
37 依然是素数:继续去掉
37
37 个位的
7
7 后,
3
3 还是素数。
输入格式
输入一个整数 n
10≤n≤10^8
输出格式
输出一个整数,表示所有小于等于
n 的超级素数的个数。
输入数据 1
30
输出数据 1
6
样例输出 1 提示
2 3 5 7 23 29
输入数据 2
50
输出数据 2
8
样例输出 2 提示
2 3 5 7 23 29 31 37
题目来源
第 11 届蓝桥杯青少组 C++ 选拔赛中级组
思路:题目不难,用埃氏筛会更快,但没必要
注意判断时要剪枝,不然会TLE
#include <iostream>
using namespace std;
int n,ans=4;//2,3,5,7
bool prime(int x){
if(x<2) return false;
if(x%2==0 && x!=2) return false;
if(x==2) return true;
for(int i=3;i*i<=x;i+=2){
if(x%i==0){
return false;
}
}
return true;
}
bool check(int x){
while(x){
int f=x%10;
if(f%2==0 && !(f==2 && x/10==0)) return false;
x/=10;
}
return true;
}
int main(){
cin>>n;
for(int i=23;i<=n;i+=2){
int k=i;
if(check(k)){
ans++;
while(k){
if(!prime(k)){
ans--;
break;
}
k/=10;
}
}
}
cout<<ans;
return 0;
}