Python 将数字拆分为其中的素数
所以我有一个数字列表,看起来像“3723311723”和“13617172343”。如你所见,这些数字可以分成素数,例如“3723311723”可以分成37、23、31等。我如何编写一个python程序,将这样一个数字作为输入,并返回其中的素数列表(按找到它们的顺序)Python 将数字拆分为其中的素数,python,string,Python,String,所以我有一个数字列表,看起来像“3723311723”和“13617172343”。如你所见,这些数字可以分成素数,例如“3723311723”可以分成37、23、31等。我如何编写一个python程序,将这样一个数字作为输入,并返回其中的素数列表(按找到它们的顺序) 谢谢。如果你知道这些数字肯定是素数,那么你只需要将字符串分解成长度为2的子字符串,对吗 s = "37233141712331719337" print([int(s[i:i+2]) for i in rang
谢谢。如果你知道这些数字肯定是素数,那么你只需要将字符串分解成长度为2的子字符串,对吗
s = "37233141712331719337"
print([int(s[i:i+2]) for i in range(0, len(s), 2)])
输出:
[37, 23, 31, 41, 71, 23, 31, 71, 93, 37]
[37, 23, 31, 41, 71, 23, 31, 7, 19, 3, 37]
True
[37, 23, 31, 41, 17, 71, 23, 31, 17, 71, 19, 37]
编辑:
这将进行递归搜索以查找不重叠的素数。如果没有有效的拆分,则返回False。递归的常见警告适用:如果输入太长,则递归太深,程序将崩溃。但如果存在问题,可以使用堆栈而不是递归
def is_prime(n):
for k in range(2, n):
if n % k == 0:
return False
return True
def primesplit(s, i=0):
if i+1 >= len(s):
return []
if i+2 <= len(s):
two_digits = int(s[i:i+2])
if is_prime(two_digits):
remaining_digits = primesplit(s, i+2)
if isinstance(remaining_digits, list):
return [two_digits] + remaining_digits
one_digit = int(s[i:i+1])
if not is_prime(one_digit):
return False
remaining_digits = primesplit(s, i+1)
if isinstance(remaining_digits, list):
return [one_digit] + remaining_digits
return False
s = "37233141712331719337"
result = primesplit(s)
print(result)
print("".join(map(str, result)) == s)
这就是您正在寻找的: 循环按原始数字中出现的顺序查找1位和2位素数,并且不会有重复的素数
In [126]: n
Out[126]: '37233141712331719337'
In [127]: primes = []
...: for i in range(len(n)-1):
...: n1 = int(n[i])
...: n2 = int(n[i:i+2])
...: if isPrime(n1):
...: if n1 not in primes:
...: primes.append(n1)
...: if isPrime(n2):
...: if n2 not in primes:
...: primes.append(n2)
...:
In [128]: primes
Out[128]: [3, 37, 7, 2, 23, 31, 1, 41, 17, 71, 19]
你的要求有点复杂,但我认为你的意思是: 给定一个数字,查找该数字内的任何两位素数(我假设它们可以重叠) 一个简单的方法是:
def isPrime(number):
if number>1:
for i in range(2,number):
if (number%i)==0:
return False
return True
else:
return False
def getPrimes(number):
number=str(number)
retList=[]
for i in range(len(number)-1):
temp=int(number[i:i+2])
if isPrime(temp):
retList+=[temp]
return retList
这不会检查单位数素数,但如果需要,可以很容易地添加(只要检查原始数字中的每个数字,如果它们是素数)
这就是您想要的吗?以下是如何使用模块中的
isprime
方法和zip
:
from sympy import isprime
n = "37233141712331719337"
lst = [int(i + j) for i, j in zip(n, n[1:]) if isprime(int(i + j))]
print(lst)
输出:
[37, 23, 31, 41, 71, 23, 31, 71, 93, 37]
[37, 23, 31, 41, 71, 23, 31, 7, 19, 3, 37]
True
[37, 23, 31, 41, 17, 71, 23, 31, 17, 71, 19, 37]
我应该补充一点,我只想找到2位数的素数,这是一个数字或字符串的输入格式?任何更容易处理的东西,你在哪里解决这个问题?我应该说1-2位数的素数,这是我的错。所以它可以从37开始,或者3,然后7,然后23,你需要更精确地描述这个问题。输入中是否有非素数?你怎么处理重叠的素数?例如,“23”可以是[23]、[2,3]或[2,3,23]。“437”可以是[3,7]、[43,3,7]或[43,7]。因此,对于数字“37233141712331719337”,如果可以拆分整个列表,我希望找到将其拆分为素数的所有变体。因此,它将返回372331417123317119337或372323314123317119337或任何其他变体,其中使用整数创建列表,并且每个拆分都是素数。对不起,我很难描述我想要什么。对于重叠的素数,它可能会留下一个具有不同可能性的嵌套列表?也可能有像4这样的非素数,但它们后面总是跟有其他可以构成2位素数的东西(所以如果有4,它后面会跟1、3或7)。这很棘手,你可能会陷入死胡同。一个选项是递归搜索,我将尝试将一些东西组合在一起。如果您可以使用嵌套列表来显示数字,那么它将是[37,[3,7]],而不是3,37,7],这正是我需要的。