悠游


私信TA

用户名:uq_87643911115

访问量:6710

签 名:

你好

等  级
排  名 42
经  验 12731
参赛次数 0
文章发表 206
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

大家好!我是糕手

解题思路:
这题正常解法,对空间巨大,到7差不多就会溢出,

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

想知道原理的可以去查下,我也不知( ´・・)ノ(._.`)

这样的话,除了n==2时,n%2==0时都是输出0

这样就只用处理奇数了,为了对回文数判断的方便建议n==1的情况,也作单独处理

因为只用对奇数进行处理,可以每次得到一个数的一半,然后构造另一半,以构造回文数的方式,再对构造好的回文数判断是否为素数

注意事项:
存素数的数组空间设6000以上,不然不够,n为9时,素数数量为5172
参考代码:

#include#includeint isprime(size_t a)//判断素数
{
    if(a<2)
    {
        return 0;
    }
    else if(a==2||a==3)
    {
        return 1;
    }
    else if(a%2==0||a%3==0)
    {
        return 0;
    }
    for(size_t i=5;i<=sqrt(a);i+=6)
    {
        if(a%i==0||a%(i+2)==0)
        return 0;
    }
    return 1;
}
size_t palind(size_t a)//构造回文数
{
    size_t c=a/10;
    while(c)
    {
        a=a*10+c%10;
        c=c/10;
    }
    
    return a;
}
int main()
{
	int n;
	scanf("%d",&n);
	
	if(n==1)
	{
	    printf("4\n2 3 5 7");
	}
	else if(n==2)
	{
	    printf("1\n11");
	}
	else if(n%2==0)
	{
	    printf("0");
	}
	else
	{
	    int a=pow(10,(n-1)/2);//取一半
	    int b=pow(10,n/2+1);
	    size_t c;
	    long long m[50000]={0};//因为数过大用long long
	    int count=0;
	    for(size_t i=a;i<b;i++)
	    {
	        c=palind(i);//返回构造的回文数
	        if(isprime(c))//判断该回文数是否是素数
	        {
	            m[count]=c;
	            count++;//素数数量
	        }
	    }
	    printf("%d\n",count);
	for(int i=0;i<count;i++)
	{
	    printf("%d ",m[i]);
	}
	}
	
	return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »