题目描述
一个正数能被表示成一个或者多个连续质数的和。求不同表示的个数。
例如41可以表示成
2+3+5+7+11+13,
11+13+17,
41;
三种素数组成的数列。
方法
先求取小于这个数的质数数列,然后利用滑动窗口一边扫描。寻找符合条件的数组的个数。
def prime(n):
"""
判断一个数是否为质数
:param n: int
:return: bool
"""
if n <= 1:
return False
i = 2
while i * i <= n:
if n % i == 0:
return False
i += 1
return True
def primelist(n):
"""
求小于等于n的质数的列表
:param n: int
:return: list
"""
p = []
for i in range(n+1):
if prime(i):
p.append(i)
return p
def listp(n):
"""
求满足条件的列表的个数
:param n: int
:return: res
"""
primlist = primelist(n)
left, right = 0, 0
sum, res = 0, 0
while right < len(primlist):
sum += primlist[right]
while sum >= n and left <= right:
if sum == n:
res += 1
sum -= primlist[left]
left += 1
right += 1
return res
if __name__=="__main__":
a = 41
print(listp(a))