测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A50849. 超级素数在大于1的自然數中,除了1和它本身以外不再有其他因数的数,被称为素数,又叫质数。超级素数是指一个素数,每去掉最后一位上一个数字,总能保证剩下的数依然为素数。比如"373"就是一个超级素数,去掉个位的"3"后,"37"依然是素數:继续去掉"37"个位的"7"后,"3"还是素数。程序命名:prime.cpp输入:输人一个整数n(10<=n<=10^8)输出:输出所有小于等于n的超级素数的个数…

填空题 困难

题目描述

超级素数

在大于1的自然數中,除了1和它本身以外不再有其他因数的数,被称为素数,又叫质数。超级素数是指一个素数,每去掉最后一位上一个数字,总能保证剩下的数依然为素数。比如

"373"就是一个超级素数,去掉个位的"3"后,"37"依然是素數:继续去掉"37"个位的"7"后,"3"还是素数。

程序命名:prime.cpp

输入:输人一个整数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

参考答案

/* 算法思想 暴力枚举(70分) 可以通过线性筛素数法将所有不超过n的素数求出, 然后枚举每个素数,判断是否符合超级素数的性质。 时间复杂度 O(10^8),最终70分,TLE。 DFS 分析超级素数的性质,会发现最高位只能由素数2 、 3 、 5 、 7组成, 其余各位只能从是奇数1 、 3 、 7 、 9 中选择, 因此可以使用DFS构造所有满足性质的超级素数。 */ #include <iostream> #include <cmath> using namespace std; int ans,n; int a[]={2,3,5,7};//最高位 int b[]={1,3,7,9};//其他位 bool check(int x){//判断素数 if(x==1)return false; for(int i=2;i<=sqrt(x);i++) if(x%i==0) return false; return true; } void dfs(int x){//深搜 if(x>n)return; ans++; for(int i=0;i<4;i++) if(check(x*10+b[i])) dfs(x*10+b[i]); } int main(int argc, char *argv[]) { cin>>n; for(int i=0;i<4;i++) dfs(a[i]); cout<<ans<<endl; return 0; }

答案解析

评标准:

30分:完成题目样例和给出的一个样例

50分:在30分的基础上完成给出的另外一个样例

100分:在50分的基础上完成给出的最后一个样例

上一题 下一题