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

版权声明:版权归Ordinarv所有 https://blog.csdn.net/ordinarv/article/details/81977046

题目大意

输出a-b内的回文质数。范围为1-1e。


分析思路

先构造回文数再判断质数肯定更快。

然而题目所给打印回文数的方式为:

产生长度为5的回文数:

for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数

     for (d2 = 0; d2 <= 9; d2++) {
         for (d3 = 0; d3 <= 9; d3++) {
           palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
         }
     }
 }

所以我写了5个不同长度的for。。。

法二:

通过打表观察发现只有11是偶数位的回文质数,所以直接把11加入队列中。只需要判断奇数位的回文数:

也就是123 12  1232  12321


AC

#include <iostream>
#include <cstdio>
#include <queue>
#include <cmath>
#include <vector>
#define MAXN 10000

using namespace std;
typedef long long LL;
priority_queue <int, vector<int>,greater<int> > pq;
 
bool is_prime(int x)
{
    for(int i=2; i<sqrt(x+0.5); i++) {
        if(x % i == 0) return false;
    }
    return true;
}
int main()
{
    while(!pq.empty()) pq.pop();
    pq.push(11);
    int sum, tmp;   
    for(int i=2; i<MAXN; i++) {
    	sum=i;
        for(tmp=i/10; tmp!=0; tmp/=10) 
            sum = sum*10 + tmp%10;           
        if(is_prime(sum))
        	pq.push(sum);
    }    
    while(!pq.empty()) {
        cout << pq.top() << endl;
        pq.pop();
    }  
    return 0;
}
 

题意Ac Code

扫描二维码关注公众号,回复: 2969065 查看本文章
#include<iostream>
#include<cmath>
using namespace std;
int obj[20000];
int product(){
	int cnt=0;
	for(int i=5;i<10;i++){
		obj[cnt]=i;cnt++;
	} //1
	for(int i=1;i<10;i++){
		obj[cnt++]=i*10+i;
	}//2
	for(int i=1;i<10;i++){
		for(int j=0;j<10;j++){
			obj[cnt++]=i*100+j*10+i;
		}
	}//3
	for(int i=1;i<10;i++){
		for(int j=0;j<10;j++){
			obj[cnt++]=i*1000+j*100+j*10+i;
		}
	}//4
	for(int i=1;i<10;i++){
		for(int j=0;j<10;j++){
			for(int k=0;k<10;k++)
			obj[cnt++]=i*10000+j*1000+k*100+j*10+i;
		}
	}//5
	for(int i=1;i<10;i++){
		for(int j=0;j<10;j++){
			for(int k=0;k<10;k++)
			obj[cnt++]=i*100000+j*10000+k*1000+k*100+j*10+i;
		}
	}//6
	for(int i=1;i<10;i++){
		for(int j=0;j<10;j++){
			for(int k=0;k<10;k++)
				for(int l=0;l<10;l++)
			obj[cnt++]=i*1000000+j*100000+k*10000+l*1000+k*100+j*10+i;
		}
	}//7
	for(int i=1;i<10;i++){
		for(int j=0;j<10;j++){
			for(int k=0;k<10;k++)
				for(int l=0;l<10;l++)
					obj[cnt++]=i*10000000+j*1000000+k*100000+l*10000+l*1000+k*100+j*10+i;
		}
	}//8
	/*for(int i=1;i<10;i++){
		for(int j=1;j<10;j++){
			for(int k=1;k<10;k++)
				for(int l=1;l<10;l++)
					for(int m=1;m<10;m++){
						obj[cnt++]=i*100000000+j*10000000+k*1000000+l*100000+m*10000+l*1000+k*100+j*10+i;
						
					}
			
		}
	}//9
	*/
	return cnt;
}
int main()
{
	int len=14760;
	product();
	int a,b;
	cin>>a>>b;
	for(int i=0;i<len;i++){
		if(obj[i]<a) continue;
		if(obj[i]>b) break;
		int q=sqrt(obj[i]),j,flag=1;
		for(j=2;j<=q;j++){
			if(obj[i]%j==0){
				flag=0;
				//cout<<obj[i]<<"res"<<j<<endl;				
				break;
			}
				
		}
		if(flag)cout<<obj[i]<<endl;
	}
	

	return 0;
}

猜你喜欢

转载自blog.csdn.net/ordinarv/article/details/81977046