题意:求[a, b]上所有的回文质数
解题思路:
- 先生成回文数,再判断是否为质数
- 如生成3个数字的回文,则XXX的前两位可以遍历10~99,然后最后一位可相应取第一位即可;如生成4个数字的回文,则XXXX的前两位可以遍历10~99,然后最后两位对称取就好。按照这样的方法就能取到所有的回文数
- 对每个生成的回文数检测是否为质数,如果是的话输出
代码:
/*
ID: zc.rene1
LANG: C
PROG: pprime
*/
#include<stdio.h>
#include<math.h>
int check_palindrome[9];
int is_prime(int num){
int i;
for(i=2; i<=sqrt(num); i++){
if(num%i==0) return 0;
}
return 1;
}
int get_len(int num){
int ret=0;
while(num!=0){
ret++;
num/=10;
}
return ret;
}
int main(void){
FILE *fin=fopen("pprime.in", "r");
FILE *fout=fopen("pprime.out", "w");
int a, b, len_a, len_b, len, i, j, copy_i, num, times;
int start;
fscanf(fin, "%d %d", &a, &b);
len_a=get_len(a);
len_b=get_len(b);
for(len=len_a; len<=(len_b>8?8:len_b); len++){
start=pow(10, (len-1)/2);
for(i=start; i<10*start; i++){
copy_i=i;
j=(len-1)/2;
/*put digits into array*/
while(copy_i!=0){
check_palindrome[j--]=copy_i%10;
copy_i/=10;
}
/*copy digits to make it a palindrome*/
for(j=len/2; j<len; j++){
check_palindrome[j]=check_palindrome[len-j-1];
}
/*count the value of number in digits*/
num=0;
times=1;
for(j=len-1; j>=0; j--){
num+=check_palindrome[j]*times;
times*=10;
}
if(num<a||num>b) continue;
/*judge if it's a prime number*/
if(is_prime(num)){
fprintf(fout, "%d\n", num);
}
}
}
return 0;
}