[USACO1.5] 回文质数 Prime Palindromes - 洛谷
一、题目分析
程序中我们需要判断是否是质数、是否是回文。可以通过函数实现然后调用。另外有一点小技巧,除了11偶数位的回文不是质数,可以减少判断次数。
另外在主程序中,对2单独处理,对于除了2以外的偶数都不是质数直接加1,并在循环的时候也只处理奇数数据。
从这个函数我们可以看到,用函数模块来处理,主函数看起来很简洁。对于判断质数、回文的函数大家可以写一个模板,然后记忆,在以后写代码的过程中,就可以直接书写,加快编程的速度和准确性。
二、程序代码
#include<stdio.h>
#include<math.h>
int check1(int x){//检查是否是偶数位,偶数位的回文不是质数
if(x>=1000&&x<=9999||x>=100000&&x<=999999) return 0;
else return 1;
}
int check2(int x){//检查是否是回文
int a[20],flag=1;
while(x>0){
a[flag]=x%10;
flag++;
x/=10;
}
for(int i=1;i<=flag/2;i++)
if(a[i]!=a[flag-i]) return 0;
return 1;
}
int check3(int x){//检查是否为质数
if(x==2) return 1;
for(int i=2;i<=sqrt(x);i++)
if(x%i==0) return 0;
return 1;
}
int main(){
int l,r;
scanf("%d%d",&l,&r);
if(l==2) printf("2\n");//把2单独处理
if(l%2==0) l++; //如果是偶数,就不是质数
if(r>9999999) r=9999999;
// r = min(9999999, r);//再大的数都不可能是回文质数
for(int i=l;i<=r;i+=2){
if(check1(i)==0) continue;
if(check2(i)==0) continue;
if(check3(i)==0) continue;
printf("%d\n",i);
}
return 0;
}