我从用户那里得到一个字符串输入,将其分解为一个字符列表,将每个字符转换为其ASCII值,然后搜索最接近的Prime数字。将(素数)ASCII值转换回字符列表,将它们连接在一起并在屏幕上打印。听起来很简单,但我觉得找到最接近的素数很棘手。
def is_prime(num):
if num > 1:
for n in range(2, num):
if (num % n) == 0:
return False
else:
return True
else:
return False
test_cases = int(input())
for _ in range(test_cases):
string = str(input())
array = list(string)
result_array = []
for i in array:
if is_prime(ord(i)):
result_array.append(i)
else:
pass
print("".join(result_array))
在最后一行"传递"声明只是有一个无错误的代码,直到我找到解决方案。这是搜索继续进行的部分。
答案 0 :(得分:3)
你的算法无法工作,因为它永远不会解决“最接近素数”问题(注意检查这样的素数效率不高:最大边界可以是n**0.5+1
)
那就是说,小写字母存在这个问题的缺陷:
素数从113跳到127.对于高小写字母,最接近的素数是127,这是不可打印的。
所以我会坚持使用大写字母(除非我们想要打印最接近的最低素数,在这种情况下小写是正常的)
我要做的是:
Z
的ASCII为96)bisect
模块在主要列表中找到字符ASCII代码的插入位置(必须排序才能bisect
工作正确)。join
代码:
import bisect
# list sampled from https://primes.utm.edu/lists/small/1000.txt
# ASCII code for 'A' is 65, no need to go lower
primes = [int(x) for x in """61 67 71 73 79 83 89 97""".split()]
word = "ABCDEFGHIJKLMNOPRSTUVWXYZ"
primeword = []
for w in word:
ow = ord(w)
i = bisect.bisect_left(primes,ow)
delta1 = abs(ow-primes[i])
delta2 = abs(ow-primes[i-1])
# select this index or next index (no risk for out of range here)
primeword.append(chr(primes[i + int(delta2 > delta1) - 1]))
print("".join(primeword))
给了我:
CCCCCGGGIIIIOOOOSSSSSYYYY
编辑:既然我们生成了素数,我们也可以直接生成字符的查找表并使用str.translate
:
primeword_dict = {65: 'C', 66: 'C', 67: 'C', 68: 'C', 69: 'C', 70: 'G', 71: 'G', 72: 'G', 73: 'I', 74: 'I', 75: 'I', 76: 'I', 77: 'O', 78: 'O', 79: 'O', 80: 'O', 82: 'S', 83: 'S', 84: 'S', 85: 'S', 86: 'S', 87: 'Y', 88: 'Y', 89: 'Y', 90: 'Y'}
print(word.translate(primeword_dict))
会更快&更短,并允许传递像"HELLO WORLD.
这样的字符串(其中包含空格和标点符号),并且只更改字母和字母。其他符号保持不变。