(洛谷P1217 https://www.luogu.com.cn/problem/P1217 )
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。 写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
第 1 行: 二个整数 a 和 b .
输出一个回文质数的列表,一行一个。
首先想到用python判断回文数会很简单:
1 def pal(a): #判断回文数 2 a1=list(str(a)) 3 b1=list(a1[::-1]) 4 5 if a1==b1: 6 return True 7 else: 8 return False 9 ‘‘‘‘ 10 i=0 #或者首尾挨个比较,只需要比较一半的长度 11 while i<=len(a1)//2: 12 if a1[i]!=b1[i]: 13 return False 14 i+=1 15 return True 16 ‘‘‘‘ 17 def zhishu(a): #判断质数 18 for i in range(2,a): 19 if a==2: 20 return True 21 elif a%i==0: 22 return False 23 return True 24 def main(): 25 a,b=map(int,input().split()) 26 for i in range(a,b+1): 27 if pal(i) and zhishu(i): 28 print(i) 29 main() 30 #python太慢了...
但显示大多数都超时了...然后用C++写了一次,同样会有超时的输出(好像并不全是python的锅)。但根据输出结果知道,输入最大范围在9989899之后不再有符合的输出,就把9989899之后的忽略,可以节省不少时间。
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 5 int h(int n); 6 int z(int n); 7 8 int main() { 9 int a, b; 10 cin >> a >> b; 11 if (b > 9989899) b = 9989899; //如果b大于,可以忽略之后的数 12 if (a % 2 == 0) a += 1; 13 for (int i = a ; i <= b;i+=2 ) 14 if (h(i) && z(i)) { 15 cout << i << endl; 16 } 17 } 18 19 int h(int n) { //判断回文数 20 int i = 0, m = n; 21 while (m) { 22 i = m % 10 + 10 * i; 23 m /= 10; 24 } 25 if (i == n) 26 return 1; 27 else 28 return 0; 29 } 30 31 int z(int n) { //判断质数 32 for (int i = 2; i <=sqrt(n); ++i) { 33 if (n % i == 0) 34 return 0; 35 } 36 return 1; 37 }
原文:https://www.cnblogs.com/somejie/p/12293698.html