原题链接:回文素数
解题思路:偶数位的回文素数只有11,这可以让我们快速处理n是偶数的情况,证明如下
一开始我是用埃氏筛处理n是奇数的情况,但是当n=9的时候,从100000000到999999999的筛完后,再对素数判断它是否为回文数,结果超时了。循环的数字太多了!转换下思路,我们手动构造回文数,只需要从10000遍历到99999即可,然后再对每个回文数用根号方法(不用根号方法仍然会超时!)判断它是否是素数即可,动态存储结果,最后再输出就行了
参考代码:
#include<stdio.h> #include<math.h> #include<stdlib.h> int f(int n) { if(n==1) return 0; for(int i=2;i<=sqrt(n);i++) if(n%i==0) return 0; return 1; } int main() { int n; scanf("%d",&n); if(n%2==0) { if(n==2) printf("1\n11"); else printf("0"); } else { // 构造回文数 用埃氏筛查找9位数的回文素数会超时 // 对于n位奇数位的回文数 可以构造(n+1)/2位的数字对称生成 int beginnum=1*pow(10,(n+1)/2-1),endnum=1*pow(10,(n+1)/2)-1; int *s = (int *)malloc(n*sizeof(int)); int index,tempnum,sum=0,*allnum=NULL; for(int i=beginnum;i<=endnum;i++) { // 分解位数 index=0,tempnum=i; while(tempnum!=0) { s[(n-1)/2+index]=s[(n-1)/2-index]=tempnum%10; tempnum=tempnum/10; index++; } if(s[0]%2==0&&n>1) continue; else for(int j=0;j<n;j++) tempnum=tempnum+s[j]*pow(10,j); if(f(tempnum)==1) { sum++; allnum = (int *)realloc(allnum,sum*sizeof(int)); allnum[sum-1]=tempnum; } } // 输出结果 printf("%d\n",sum); for(int i=0;i<sum;i++) printf("%d ",allnum[i]); } }
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复