在此计划中查找最小和最近的素数的问题

时间:2016-11-29 12:47:41

标签: python string list ascii

我的任务是将每个字母转换为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方法静态尝试过,但这不是正确的方法。我怎样才能做到这一点?

4 个答案:

答案 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