解题思路:偶数位的回文素数只有11,这可以让我们快速处理n是偶数的情况,证明如下

微信图片_20231203125320.png

一开始我是用埃氏筛处理n是奇数的情况,但是当n=9的时候,从100000000到999999999的筛完后,再对素数判断它是否为回文数,结果超时了。循环的数字太多了!转换下思路,我们手动构造回文数,只需要从10000遍历到99999即可,然后再对每个回文数用根号方法(不用根号方法仍然会超时!)判断它是否是素数即可,动态存储结果,最后再输出就行了

6c5c9432ac9b988aa39c226bd4e9bc9.png



参考代码:

#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.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论