OpenJudge - 11:回文素数


解题思路(70分):

1.由于数据量比较大,所以采用埃式筛选法来筛选素数

2.确定最小值和最大值,min=pow(10,n-1),max=pow(10,n)

3.依次枚举,如果是回文数并且是素数的话,计数器累加,存入数组

4.输出计数器和各个回文素数


#include<bits/stdc++.h>
using namespace std;
bool a[1000000005];//埃式筛选法求素数
int num[10000000];//存回文素数数组bool check(int x)//判断是否为回文数
{int m=x,count=0;while(m!=0){count=count*10+m%10;m=m/10;}if(count==x)return true;elsereturn false;
}
int main()
{int n,sum=0,k=0;a[1]=1;cin>>n;int min=pow(10,n-1);//确定最小值int max=pow(10,n);//确定最大值for(int i=2;i<=max;i++){if(a[i]==0)for(int j=2;j*i<=max;j++)a[i*j]=1;}//埃式筛选法求素数for(int i=min;i<max;i++){if(check(i)&&a[i]==0)//如果这个数是质数并且是回文数{sum++;//计数器累加num[++k]=i;//将该数存入数组}}cout<<sum<<endl;//输出回文素数的个数for(int i=1;i<=k;i++)//依次输出这些数cout<<num[i]<<" ";return 0;
}

优化思路(100分):

1.当数据量比较大的时候,很明显挨个判断是否为回文数也会超时,该如何优化呢?

重点:在素数领域有一个性质,偶数位数的除了11以外全部不是回文素数

2.那么只需要对n为1和2的时候进行特判,n为1的时候,回文素数有4个分别是2,3,5,7,当n为2的时候,只有1个回文素数是11

3.当输入的n为偶数的时候,直接输出0即可

4.当n为奇数的时候,为了缩短时间,可以采用构造回文数的方法,构造回文数中,如果前n/2-1位确定了,那么可以使用累加版数位分离的方法补齐另一半,然后再对构造好的回文数判断是否是素数,即可缩短时间


#include<bits/stdc++.h>
using namespace std;
long long a[50000];
bool check1(int x)//检验是否为素数
{for(int i=2;i<=sqrt(x);i++)if(x%i==0)return false;return true;
}
int build(int x)//构造回文数,例如123返回了12321
{int temp=x;x=x/10;while(x!=0){temp=temp*10+x%10;x=x/10;}return temp;
}
int main()
{int n,k=0;cin>>n;if(n==1)//对于1和2进行特判 {cout<<4<<endl<<2<<" "<<3<<" "<<5<<" "<<7;return 0; }else if(n==2){cout<<1<<endl<<11;return 0;}else if(n%2==0)//偶数位数的所有数都不是回文素数,11除外 {cout<<0;return 0;}else{int min=pow(10,(n+1)/2-1);int max=min*10;for(int i=min;i<max;i++){int num=build(i);if(check1(num))a[++k]=num;}}cout<<k<<endl;for(int i=1;i<=k;i++)cout<<a[i]<<" ";return 0;
}

openjudge 1.13.11 回文素数相关推荐

  1. OpenJudge NOI 1.13 11:回文素数

    [题目链接] OpenJudge NOI 1.13 11:回文素数 [题目考点] 1. 函数 2. 质数 3. 回文数 [解题思路] 输入的数字n可以达到9位数字,枚举判断每个数字是否是回文数与质数, ...

  2. leetcode —— 866. 回文素数

    求出大于或等于 N 的最小回文素数. 回顾一下,如果一个数大于 1,且其因数只有 1 和它自身,那么这个数是素数. 例如,2,3,5,7,11 以及 13 是素数. 回顾一下,如果一个数从左往右读与从 ...

  3. Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开

    6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数.编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开 题目 题目描述 破题 代码 题目 题目描述 ...

  4. Java黑皮书课后题第6章:**6.26(回文素数)回文素数是指一个数同时为素数和回文数。编程程序,显示前100个回文素数,每行显示10个数,数字中间用一个空格隔开

    6.26(回文素数)回文素数是指一个数同时为素数和回文数.编程程序,显示前100个回文素数,每行显示10个数,数字中间用一个空格隔开 题目描述与运行示例 代码 题目描述与运行示例 6.26(回文素数) ...

  5. NUC1214 回文素数

    回文素数 时间限制: 1000ms 内存限制: 65536KB 问题描述 151 是一个回文素数,因为它既是一个素数又是回文数(回文数是指一个数 从左到右 和 从右到左 读的结果一样). 试写一个程序 ...

  6. NUC1214 回文素数【回文+素数】

    回文素数 时间限制: 1000ms 内存限制: 65536KB 问题描述 151 是一个回文素数,因为它既是一个素数又是回文数(回文数是指一个数 从左到右 和 从右到左 读的结果一样). 试写一个程序 ...

  7. 回文素数(杭电OJ,不喜欢这个题)

    Problem Description xiaoou33对既是素数又是回文的数特别感兴趣.比如说151既是素数又是个回文.现在xiaoou333想要你帮助他找出某个范围内的素数回文数,请你写个程序找出 ...

  8. 经典编程习题,用Java实现:矩阵转置、最大公约数和最小公倍数、计算自然对数的底e的值、输出1000以内的回文素数、判断两个年份之间的平闰年情况。

    经典编程习题,用Java实现 1.矩阵转置 2.最大公约数和最小公倍数 3.计算自然对数的底e的值 4.输出1000以内的回文素数 5.判断两个年份之间的平闰年情况 1.矩阵转置 public cla ...

  9. 《算法0基础100讲》(第7讲)素数判定——866.回文素数

    1.素数  <1>定义:  一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数;否则称为合数.   <2>证明为素数 ...

最新文章

  1. jQuery的Prettydate插件
  2. .Net里一个用于驱动摄像头的类
  3. Java技术分享:NIO实战教程!
  4. boost::promise相关的测试程序
  5. 【第六期】拿不到offer全额退款 !人工智能工程师培养计划招生
  6. Cocos2d-x项目移植到WP8小记
  7. Android 应用更新和在服务器下载android应用
  8. 对生信与计算生物的一点认识[转载]
  9. lua编译器和ide
  10. 12_第一个Flutter程序
  11. DP动态规划--乡村邮局问题-Post Office(POJ-1160)
  12. 路由跟踪在线Tracert工具说明
  13. mysql的填充因子_聚集索引和填充因子fill factor的设置,减少死锁 | 学步园
  14. 智能流程机器人助你“聚划算”
  15. python 图片文字识别orc
  16. K12在线教育持续升温,教育需线上线下相结合!
  17. 【银河麒麟国产服务器安装mysql、nginx和docker遇到的问题】(回忆篇)
  18. java开源验证框架OVAL
  19. 《Python绝技:运用Python成为顶级黑客》 用Python刺探网络
  20. 栋的周评 | 第七回合(定期更新、动态、架构、云技术、算法、后端、前端、收听/收看、英文、书籍、影视、好歌、新奇)

热门文章

  1. 牛客编程巅峰赛S1第6场 - 黄金钻石王者 C.dijkstra
  2. 操作系统-MIT6.S081学习
  3. 基于OSPF(MGRE全连网状、星型结构)
  4. Thinkphp verify图形验证码
  5. R型隔离变压器是如何处理接地电流的呢?
  6. java获取系统斜线_java从含反斜线路径截取文件名
  7. 自己制作的视频,如何转换成二维码?
  8. 双重for循环(嵌套for循环)
  9. CSV文件简单介绍(逗号分隔值Comma-Separated Values)
  10. Linux Shell 脚本交互输入