我的任务是将每个字母转换为ASCII值。然后找到该ASCII值的最接近的素数并返回字母表。但输出字符串应仅在 [a-zA-Z] 中。
我的代码是:
def find_next_prime(n):
return find_prime_in_range(n, 2*n)
def find_prime_in_range(a, b):
for p in range(a, b):
for i in range(2, p):
if p % i == 0:
break
else:
return p
return None
s = list(raw_input())
print "Given : ",s
asc = [ord(i) for i in s]
print "Ascii Values : ",asc
nearest_primes = [find_next_prime(x) for x in asc]
print 'Nearest_primes : ',nearest_primes
asc = [chr(i) for i in nearest_primes]
print "Final output : ",''.join(asc)
我得到的输出:
AFREEN
Given : ['A', 'F', 'R', 'E', 'E', 'N']
Ascii Values : [65, 70, 82, 69, 69, 78]
Nearest_primes : [67, 71, 83, 71, 71, 79]
Final output : CGSGGO
我想要的是什么:
AFREEN
Given : ['A', 'F', 'R', 'E', 'E', 'N']
Ascii Values : [65, 70, 82, 69, 69, 78]
Nearest_primes : [67, 71, 83, 67, 67, 79]
Final output : CGSCCO
所以我遇到了最小和最近素数的问题。
对于数字69, 67 --- 69 --- 71 最接近的素数,但我需要最小的素数。即 67
我在这里使用find_next_prime
方法静态尝试过,但这不是正确的方法。我怎样才能做到这一点?
答案 0 :(得分:4)
你甚至从不考虑67.你的范围迭代从69开始,只是上升改变下面的主要搜索范围。
def find_next_prime(n):
return find_prime_in_range(n/2, 2*n) # you may go lower if you want
编辑:
正如评论中所述,这将找到n/2
的最低素数。如果你真的需要最接近的素数,你需要测量距离并从中选择最低值。
答案 1 :(得分:2)
AFREEN
Given : ['A', 'F', 'R', 'E', 'E', 'N']
Ascii Values : [65, 70, 82, 69, 69, 78]
Nearest_primes : [67, 71, 83, 67, 67, 79]
Final output : CGSCCO
E最近的素数较低。考虑到这一点。 您必须在下面定义一个范围。
例如:
def find_prime_in_range(a, b):
range_bt_a_b = b-a
for dist in range(range_bt_a_b):
upperElement = a+dist
lowerElement = a-dist
...
答案 2 :(得分:2)
试试这个。基本上,您将迭代检查上方和下方的每个值,首先返回较低的值。只需检查sqrt(a),以及预先计算素数值,就可以使素数函数更有效。
def check_prime(a):
for i in range(2, a):
if a % i == 0:
return False
return True
def find_next_prime(n)
# Not sure if you want this line or not
# if check_prime(n):
# return n
low = n - 1
high = n + 1
while True:
if check_prime(low):
return low
elif check_prime(high):
return high
else:
low -= 1
high += 1
答案 3 :(得分:2)
您可以查找下一个和上一个数字,然后选择最接近的数字:
def is_prime(n):
for i in range(2, n):
if n % i == 0:
break
else:
return n
def find_previous_prime(n):
return find_next_prime(n, offset=-1)
def find_next_prime(n, offset = 1):
p = n
while p < 2 * n:
p += 1 * offset
if is_prime(p):
break
return p
p, n = find_previous_prime(69), find_next_prime(69))
print p if 69 - p < n - 69 else n
输出
67