题目描述 Description

因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数.
写一个程序来找出范围[a,b](5<=a<b<=100,000,000)间的所有回文质数;

因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数.写一个程序来找出范围[a,b](5<=a<b<=100,000,000)间的所有回文质数;

输入描述 Input Description

*Line 1: a,b

输出描述 Output Description

a与b之间(含)的所有回文质数

一行一个

样例输入 Sample Input

5 500

样例输出 Sample Output

5
7
11
101
131
151
181
191
313
353
373
383

先找回文数,再判断是不是质数。

代碼實現(codevs 38ms,洛谷 44ms):

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. int a,b,c,s;
  5. int hw[];
  6. void find(int x){
  7. c=s=x;c/=;
  8. while(c){s*=;s+=c%;c/=;}//构造奇数数位的回文。
  9. if(s>b) return;
  10. if(s>=a) hw[++hw[]]=s;//满足条件的回文,录入。
  11. c=s=x;
  12. while(c){s*=;s+=c%;c/=;}//构造偶数数位的回文。
  13. if(s>b) return;
  14. if(s>=a) hw[++hw[]]=s;//满足条件的回文,录入。
  15. for(int i=;i<;i++) find(*x+i);//继续寻找。
  16. }
  17. int main(){
  18. scanf("%d%d",&a,&b);
  19. for(int i=;i<=;i+=){
  20. s=i;
  21. find(i);
  22. }
  23. sort(hw+,hw+hw[]+);//排序,因为要求顺序输出
  24. for(int i=;i<=hw[];i++)
  25. for(int j=;j*j<=hw[i];){
  26. if(hw[i]%j==) break;
  27. j++;
  28. if(j*j>hw[i]) printf("%d\n",hw[i]);//输出素数。
  29. }
  30. return ;
  31. }

应老师要求,稍微优化了一下(codevs 4ms,洛谷 25ms):

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. const int maxn=;
  5. int a,b,c,s;
  6. int hw[];
  7. int zs[maxn],zsm,d,l,re;
  8. char ch[];
  9. bool v[maxn+];
  10. int read(){
  11. l=,re=;
  12. while(ch[l]=getchar())
  13. if(ch[l]>=''&&ch[l]<='') break;
  14. l++;
  15. while(ch[l]=getchar()){
  16. if(ch[l]>=''&&ch[l]<='') l++;
  17. else break;
  18. }
  19. for(int i=;i<l;i++) re=re*+ch[i]-'';
  20. return re;
  21. }
  22. void write(int x){
  23. l=;
  24. while(x){ch[l++]=x%+'';x/=;}
  25. for(int i=l-;i>=;i--) putchar(ch[i]);
  26. putchar('\n');
  27. }
  28. void find(int x){
  29. c=s=x;c/=;
  30. while(c){s*=;s+=c%;c/=;}
  31. if(s>b) return;
  32. if(s>=a&&(s%||s==)) hw[++hw[]]=s;
  33. for(int i=;i<;i++) find(*x+i);
  34. }
  35. int main(){
  36. for(int i=;i<=maxn;i++)
  37. if(!v[i]){
  38. zs[zsm++]=i;d=i+i;
  39. while(d<=maxn){v[d]=;d+=i;}
  40. }
  41. a=read();b=read();
  42. for(int i=;i<=;i+=){s=i;find(i);}
  43. if(>=a&&<=b) hw[++hw[]]=;
  44. sort(hw+,hw+hw[]+);
  45. for(int i=;i<=hw[];i++){
  46. d=;
  47. while(){
  48. if(hw[i]%zs[d++]==) break;
  49. if(zs[d]*zs[d]>hw[i]||d>zsm){write(hw[i]);break;}
  50. }
  51. }
  52. return ;
  53. }

codevs上跑4ms的不是这段代码,但这段代码理论上更优,可能是评测机不在状态吧。不敢继续攻击网站了。

题目描述

因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。

写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

输入输出格式

输入格式:

第 1 行: 二个整数 a 和 b .

输出格式:

输出一个回文质数的列表,一行一个。

输入输出样例

输入样例#1:

  1. 5 500
输出样例#1:

  1. 5
  2. 7
  3. 11
  4. 101
  5. 131
  6. 151
  7. 181
  8. 191
  9. 313
  10. 353
  11. 373
  12. 383

说明

Hint 1: Generate the palindromes and see if they are prime.

提示 1: 找出所有的回文数再判断它们是不是质数(素数).

Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.

提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。

题目翻译来自NOCOW。

USACO Training Section 1.5

产生长度为5的回文数:

  1. for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
  2.  
  3. for (d2 = 0; d2 <= 9; d2++) {
  4. for (d3 = 0; d3 <= 9; d3++) {
  5. palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
  6. }
  7. }
  8. }
  1. 如果先判素数,再判断是不是回文数会超时。
    因为,很明显,素数比回文数多得多。
    代码实现(88):
  1. 1 #include<cstdio>
  2. 2 int a,b,c,d,l;
  3. 3 char ch[12];
  4. 4 bool v[100000010];
  5. 5 int main(){
  6. 6 scanf("%d%d",&a,&b);
  7. 7 for(int i=2;i<=b;i++)
  8. 8 if(!v[i]){
  9. 9 c=2*i;d=i;l=0;
  10. 10 if(i>=a){
  11. 11 for(l=0;l<9;l++){
  12. 12 ch[l]=d%10+'0';d/=10;
  13. 13 if(!d) break;
  14. 14 }
  15. 15 for(int i=0;i<=l;i++){
  16. 16 if(ch[i]!=ch[l-i]) break;
  17. 17 if(i==l) printf("%s\n",ch);
  18. 18 }
  19. 19 }
  20. 20 while(c<=b){v[c]=1;c+=i;}
  21. 21 }
  22. 22 return 0;
  23. 23 }
  1. 应该先找到满足要求的回文数,而后判断其是否为素数。
    代码实现(AC):
  1. 1 #include<cstdio>
  2. 2 #include<algorithm>
  3. 3 using namespace std;
  4. 4 int a,b,c,s;
  5. 5 int hw[300000];
  6. 6 void find(int x){//find到所有回文数,并存入hw数组。
  7. 7 c=s=x;c/=10;
  8. 8 while(c){s*=10;s+=c%10;c/=10;}
  9. 9 if(s>b) return;
  10. 10 if(s>=a) hw[++hw[0]]=s;
  11. 11 c=s=x;
  12. 12 while(c){s*=10;s+=c%10;c/=10;}
  13. 13 if(s>b) return;
  14. 14 if(s>=a) hw[++hw[0]]=s;
  15. 15 for(int i=0;i<10;i++) find(10*x+i);
  16. 16 }
  17. 17 int main(){
  18. 18 scanf("%d%d",&a,&b);
  19. 19 for(int i=1;i<=9;i+=2){
  20. 20 s=i;
  21. 21 find(i);
  22. 22 }
  23. 23 sort(hw+1,hw+hw[0]+1);//因为调整回文输入先后太麻烦,所有加了个快排,当然,由于上面的原因,时间上是允许的。
  24. 24 for(int i=1;i<=hw[0];i++)
  25. 25 for(int j=2;j*j<=hw[i];){
  26. 26 if(hw[i]%j==0) break;j++;
  27. 27 if(j*j>hw[i]) printf("%d\n",hw[i]);
  28. 28 }
  29. 29 return 0;
  30. 30 }

有点恶心。

题目来源 CODE[VS],洛谷

回文质数 USACO的更多相关文章

  1. 【USACO 1.5.2】回文质数

    [题目描述] 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,0 ...

  2. 回文质数 Prime Palindromes

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...

  3. P1217 [USACO1.5]回文质数 Prime Palindromes

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...

  4. P1217 [USACO1.5]回文质数 Prime Palindromes(求100000000内的回文素数)

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  5. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  6. 洛谷 P1217 回文质数

    洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...

  7. luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

    P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找 ...

  8. 洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes【取回文数/数论/字符串】

    题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000 ...

  9. P1217 [USACO1.5]回文质数 Prime Palindromes(stringstream,sizeof(num)/sizeof(num[0]),打表)

    题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围 [a,b](5≤a<b≤100,000,000)( 一亿)间 ...

随机推荐

  1. 个人微信号二次开发SDK协议,个人微信号二次开发api接口

    通过这个API接口可以做什么? 通过我们提供的API接口您可以开发: 工作手机(如:X创,X码,XX管家等) 微信群讲课软件(如:讲课X师,一起X堂等) 微信社群管理软件(如:小X管家,微X助手等) ...

  2. linux rpm 安装

    1.rpm 安装rpm -ivh package_name-i:install的意思-v:查看更详细的安装信息-h:以安装信息栏显示安装进度rpm -ivh package_name --test 2 ...

  3. Snackbar:用它来替换Toast 显示短提示

    简介 Snackbar 它是Toast的子类.主要用来提示短暂的提示信息后,然后它自动消失. 它寄生在普通view上,具有一些基本功能. 它寄生在 CoordinatorLayout 时,有以下两个特 ...

  4. html与html5 总结

    时间:于2017年12月3日 19:35:18开始 用于: 这文章用于个人技术总结(全文转发请标明出处,小段摘抄随意) HTML笔记1.html标签不区分大小写,但是建议小写2.常用标签: 可用在he ...

  5. rem自适应布局小结001

    在最近的移动端布局当中,最炙手可热的方式便是使用rem进行元素的布局.以下便是从最近的文章中所总结出来的一点东西. 首先,我们必须有以下的疑问: rem的本质是什么? rem如何实现自适应布局? 如何 ...

  6. 计算给定数组 arr 中所有元素的总和的几种方法

    1.forEach遍历: function sum(arr) {     var result = 0;     arr.forEach(function(item,index) {          ...

  7. 类支付宝密码输入框NumberEditText(简单粗暴的定制方式)

    因为项目需要,设计了一个下图样的验证码输入框(ps:个人认为还不如直接一个EditText,用户友好度可能更好,何况这页面99.9%的用户不会使用,但是没办法,别人才是专业的设计师). 其实界面很简单 ...

  8. ThinkPHP系统流程

    1.用户通过入口文件访问控制器2.控制器从模型层中提取数据3.控制器将数据返回模板页面

  9. 关于使用Axis2 webservice 处理Fault响应时抛org.apache.axis2.AxisFault的分析

    使用Axis2这个框架进行webservice协议通讯,期间出了个问题,我(CLIENT)请求后,当服务端返回符合协议的SOAP异常报文,例如<soap:fault> ... 我的程序直接 ...

  10. ajax的底层前后台交互

    为什么用ajax或者它的优点: 异步加载数据,无需切换页面 更加的用户体验,局部刷新,及时验证,操作步骤简化: 节省流量 js控制数据的加载,更加灵活多用. 底层就是XMLHttpRequest对象: ...