题目英文描述:
The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 1000,000,000); both a and b are considered to be within the range .
InputLine 1: Two integers, a and b
OutputThe list of palindromic primes in numerical order, one per line.
sample input :
5 500
sample output:
5
7
11
101
131
151
181
191
313
353
373
383
刚开始的思路:
就是想着写个素数判定函数、回数判定函数,同时满足条件即可~可是提交上去,没有AC,而是显示超时了。
#include <stdio.h> #include <math.h> int Prime(int n) { int i; double k; k=sqrt(n); for(i=2;i<=k;i++) { if (n%i==0) { return 0; } } return 1; } int Palindromes(int num) { int sum = 0; //关键代码 int temp = num; while(temp) { sum = sum*10 + temp%10; temp /= 10; } if (sum == num) return 1; else return 0; } int main() { int num1= 0 ,num2 = 0; while(scanf("%d %d",&num1,&num2)!=EOF) { int i = num1; for(;i<=num2;i++) { if(Palindromes(i)) { if(Prime(i)) printf("%d\n",i); } } } return 0; }
之后在网上找资料,才发现,可以利用回数的规律对回数的判定进行优化的。以下是基于回数判定的优化~已经AC;
#include <stdio.h> #include <stdlib.h> #include <math.h> int Prime(int n) { int i; double k; k=sqrt(n); for(i=2;i<=k;i++) { if (n%i==0) { return 0; } } return 1; } int main() { int a,b,c,d,e,f,g,y; scanf("%d %d",&f,&g); for (a=5;a<=7;a++) { if (Prime(a)==1&&a>=f&&a<=g) { printf("%d\n",a); } } for (a=1;a<=9;a+=2) { y=11*a; if(Prime(y)==1&&y>=f&&y<=g) printf("%d\n",y); } for (a=1;a<=9;a+=2) { for(b=0;b<=9;b++) { y=a*101+10*b; if(Prime(y)==1&&y>=f&&y<=g) printf("%d\n",y); } } for (a=1;a<=9;a+=2) { for(b=0;b<=9;b++) { for (c=0;c<=9;c++) { y=10001*a+1010*b+100*c; if (Prime(y)==1&&y>=f&&y<=g) printf("%d\n",y); } } } for (a=1;a<=9;a+=2) { for (b=0;b<=9;b++) { for (c=0;c<=9;c++) { for (d=0;d<=9;d++) { y=1000001*a+100010*b+10100*c+1000*d; if (Prime(y)==1&&y>=f&&y<=g) printf("%d\n",y); } } } } for (a=1;a<=9;a+=2) { for (b=0;b<=9;b++) { for (c=0;c<=9;c++) { for (d=0;d<=9;d++) { for (e=0;e<=9;e++) { y=100000001*a+10000010*b+1000100*c+101000*d+10000*e; if (Prime(y)==1&&y>=f&&y<=g) printf("%d\n",y); } } } } } return 0; }