题目描述
因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。
写一个程序来找出范围 [a,b] (5 \le a < b \le 100,000,000)[a,b](5≤a<b≤100,000,000)( 一亿)间的所有回文质数。
输入格式
第 1 行: 二个整数 a 和 b .
输出格式
输出一个回文质数的列表,一行一个。
输入输出样例
输入
5 500输出
5 7 11 101 131 151 181 191 313 353 373 383
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
产生长度为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;//(处理回文数...)
}
}
}
代码示例:
下面的代码使用了埃氏筛进行素数的筛选
import numpy as np
MAXN = 10000005
vis = np.zeros(MAXN) # 默认全未被访问过
pp = np.zeros(MAXN) # 默认全为合数
prime = np.full(MAXN, MAXN) # 存放质数的个数和下标
def ishuiwen(x):
y = x
num = 0
while y != 0:
num = num * 10 + y % 10
y = int(y/10)
if num == x:
return 1
else:
return 0
def isprime(m):
count = 0
for j in range(2, m + 1):
if vis[j] == 0: # j未被访问,默认j为质数
prime[count] = j # 存储质数的下标j,count为质数的个数
count += 1 # 质数个数+1
pp[j] = 1 # 这个数置为质数
k = 0
while (k <= count) & (int(j * prime[k]) <= m):
temp = int(j * prime[k])
vis[temp] = j
k += 1
if j % prime[k-1] == 0:
break
(a, b) = map(int, input().split())
if b >= 10000000:
b = 9999997
isprime(b)
for i in range(a, b + 1):
if (ishuiwen(i) == 1) & (pp[i] == 1) & (vis[i] == 0):
print(i)
(怎么说呢,就是跑的时候时间太长了,超时了T.T)还希望各位大佬给点指导哇┭┮﹏┭┮
看到有人用题目提到的for循环形成回文数解题,有、、baoli但全AC了0.0
只能说大佬快教我改代码让它不要超时!!
# 转自洛谷P1217 [USACO1.5]回文质数 Prime Palindromes题解
import math
def fun(a):
for i in range(2, int(math.sqrt(a))+1):
if a % i == 0:
return 0
return 1
x = [2, 3, 5, 7, 11]
for i in range(1, 10):
for j in range(0, 10):
for k in range(0, 10):
for l in range(0, 10):
temp = i * 10000000 + j * 1000000 + k * 100000 + l * 10000+l * 1000+k * 100+j * 10+i
if fun(temp) == 1:
x.append(temp)
i += 1
for i in range(1, 10):
for j in range(0, 10):
for k in range(0, 10):
temp = i * 100000 + j * 10000 + k * 1000 + k * 100 + j * 10 + i
if fun(temp) == 1:
x.append(temp)
for l in range(0, 10):
temp = i * 1000000 + j * 100000 + k * 10000 + l * 1000+k * 100+j * 10+i
if fun(temp) == 1:
x.append(temp)
i += 1
for i in range(1, 10):
for j in range(0, 10):
temp = i * 1000 + j * 100 + j * 10 + i
if fun(temp) == 1:
x.append(temp)
for k in range(0, 10):
temp = i * 10000 + j * 1000 + k * 100 + j * 10 + i
if fun(temp) == 1:
x.append(temp)
i += 1
for i in range(1, 10):
for j in range(0, 10):
temp = i * 100 + j * 10 + i
if fun(temp) == 1:
x.append(temp)
i += 1
a, b = map(int, input().split())
x.sort()
for i in range(len(x)):
if x[i] > b:
break
if x[i] >= a:
print(x[i])