3 条题解

  • -1
    @ 2023-12-24 11:28:43

    拆成一半!!!哈哈哈

    #include <iostream>
    #include <cmath>
    #pragma GCC optimize(3)
    using namespace std;
    const int N=1e8+10;
    int n,ans;
    long long sum[N],len;
    bool c1(int x)
    {
    	if(x==1)
    	{
    		return 0;
    	}
    	for(int i=2;i<=sqrt(x);++i)
    	{
    		if(x%i==0)
    		{
    			return 0;
    		}
    	}
    	return 1;
    }
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(NULL);
    	cout.tie(NULL);
    	cin>>n;
    	if(n==1)
    	{
    		cout<<4<<endl<<"2 3 5 7";
    		return 0;
    	}
    	long long c;
    	if(n&1)
    	{
    		c=pow(10,n/2-1);
    		for(int i=c;i<=c*10-1;++i)
    		{
    			for(int k=0;k<=9;k++)
    			{
    				long long p=i,l=0;
    				while(p!=0)
    				{
    					l*=10;
    					l+=p%10;
    					p/=10;
    				}
    				long long j=i;
    				j*=10;
    				j+=k;
    				j*=c*10;
    				j+=l;
    				if(c1(j))
    				{
    					ans++;
    					sum[++len]=j;
    				}
    			} 
    			
    		}
    	}
    	else 
    	{
    	    c=pow(10,n/2-1);
    	    for(int i=c;i<=c*10-1;++i)
    		{
    			long long p=i,l=0;
    			while(p!=0)
    			{
    				l*=10;
    				l+=p%10;
    				p/=10;
    			}
    			long long j=i;
    			j*=c*10;
    			j+=l;
    			if(c1(j))
    			{
    				ans++;
    				sum[++len]=j;
    			}
    		}
    	} 
    	cout<<ans<<endl;
    	for(int i=1;i<=len;++i)
    	{
    		cout<<sum[i]<<" "; 
    	}
    	return 0;
    }
    
    • -1
      @ 2023-5-28 20:03:34

      如果你也跟我我一样TLE,那么这件事情真的是泰库……啊呸,回归正题

      看到这题,我就想到先暴力每一个数,先判断素数,再判断回文数,这样太慢啦!喜得吉利分数66,但是不要怕,我会比你先WA的!

      经过了114514个夜晚的苦思冥想,我终于想出来啦:先枚举范围内的回文数,在逐一判断素数,果仁AC了

      核心代码:

      for(int i=10;i<=99999;i++){//上限是9位,就枚举到9/2+1位
      	int tmp=i/10,k=i;//细节除以10,由于除了11,所有的偶数位数都不是素数 
      	while(tmp)k=k*10+tmp%10,tmp/=10;//创造奇数位回文数 
      	if(x<=k&&k<=y&&is_prime(k))//代码区: 将符合的数加入数组;//判断是否在范围内 
      }
      

      (记得特判1位数和两位数,我的代码还是可以优化的)

      • -2
        @ 2023-4-21 21:11:51
        #include<iostream>
        using namespace std;
        
        int nn[6000];
        
        int main()
        
        {
        
        int n,s=1,x,y,num=0;
        
        bool f;
        
        cin>>n;
        
        if(n==2)
        
        cout<<"1\n11";
        
        else if(n%2==0)
        
        cout<<0;
        
        else if(n==1)
        
        cout<<"4\n2 3 5 7";
        
        else
        
        {
        
        for(int i=1;i<(n+1)/2;i++)s*=10;//以1*10^((n+1)/2-1)为基数
        
        for(int i=s;i<s*10;i++)
        
        {//到1*10^((n+1)/2)结束
        
        f=1;
        
        for(y=i/10,x=i;y>0;y/=10)x=x*10+y%10;//构造回文数
        
        for(int j=2;j*j<=x;j++)//判断构造数是否为素数
        
        if(x%j==0)
        
        {
        
        f=0;
        
        break;
        
        }
        
        if(f)nn[num++]=x;
        
        }
        
        cout<<num<<endl;
        
        for(int i=0;i<num;i++)
        
        cout<<nn[i]<<" ";
        
        }
        
        return 0;
        
        }
        
        • 1

        信息

        ID
        1001
        时间
        1000ms
        内存
        128MiB
        难度
        7
        标签
        递交数
        368
        已通过
        72
        上传者