鱼C论坛

 找回密码
 立即注册
查看: 4140|回复: 14

[技术交流] Python:每日一题 109

[复制链接]
发表于 2017-10-2 17:19:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2017-10-2 21:24 编辑

首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
我们知道质数(素数)是2,3,5,7,11,13,17......
前n个质数相加,有可能也是质数,例如2+3=5,2+3+5+7=17
要求列出1000以内,能由从2开始的前n个质数相加得到的质数列表。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-10-2 19:14:44 | 显示全部楼层
是前任意个相加,没理解错吧,
筛出质数,累加,求交集
from itertools import accumulate

def fun(n):
    prime = [i for i in range(2,n+1) if 0 not in [i%j for j in range(2,int(i**0.5)+1)]]
    acc_prime = set(accumulate(prime)) - {2} # 2 作为累加第一项多余
    return set(prime) & acc_prime

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-2 20:31:49 | 显示全部楼层
def primefactor(n):
    lst = [i for i in range(2, n+1) if is_prime(i)]
    nlst = []
    
    for i in range(2,len(lst)):
        if sum(lst[:i]) > lst[-1]:
            if is_prime(sum(lst[:i])):
                nlst.append(sum(lst[:i]))
        elif sum(lst[:i]) in lst:
            nlst.append((sum(lst[:i])))

    return nlst

def is_prime(n):
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-2 20:42:15 | 显示全部楼层
solomonxian 发表于 2017-10-2 19:14
是前任意个相加,没理解错吧,
筛出质数,累加,求交集

又看了一遍题,发现和你理解有点区别。。貌似你理解的对的。。尴尬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-2 21:21:21 | 显示全部楼层
bush牛 发表于 2017-10-2 20:42
又看了一遍题,发现和你理解有点区别。。貌似你理解的对的。。尴尬

审题,敲黑板,划重点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-10-2 21:23:29 | 显示全部楼层
solomonxian 发表于 2017-10-2 19:14
是前任意个相加,没理解错吧,
筛出质数,累加,求交集

我可能没有写清楚,每次都是从2开始加。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-2 22:02:37 | 显示全部楼层
def fun(n):
    new_prime = []
    prime = [i for i in range(2,n+1) if 0 not in [i%j for j in range(2,int(i**0.5)+1)]]
    for i in range(1,len(prime)):
        if sum(prime[:i+1]) in prime:
            new_prime.append(sum(prime[:i+1]))
    return new_prime
print(fun(1000))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-3 12:21:37 | 显示全部楼层
#质数求和仍然为质数
#求出1-1000的质数
list1 = [2,3]
sign = 0
for i in range(2,1000):
    for j in range(2,i//2 + 1):
        if i % j != 0:
            sign = 1
        else:
            sign = 0
            break
    if sign == 1:
        list1.append(i)
#print(list1)
#求出质数加和还为质数
length = len(list1)
sum = 0
list2 = []
for i in range(length):
    sum = sum + list1[i]
    if sum > 1000:
        break
    elif (sum in list1):
        list2.append(sum)

print(list2)
运行结果:[2, 5, 17, 41, 197, 281]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-5 19:49:24 | 显示全部楼层
from itertools import accumulate

def primefactor(itertor):
    return (i for i in itertor if 0 not in (i%j for j in range(2,int(i**0.5+1))))
def main(n):
    return list(primefactor(accumulate(primefactor(range(2,1000)[:n]))))
if __name__ == "__main__":
    print(main(1000))
[2, 5, 17, 41, 197, 281, 7699, 8893, 22039, 24133, 25237, 28697, 32353, 37561, 38921, 43201, 44683, 55837, 61027, 66463, 70241]

借鉴了一下 solomonxian 大佬的accumulate函数

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-6 09:56:35 | 显示全部楼层
zhengshu=1000
prime=[]
def isprime(num):
    # 如果为2或者3时 为质数
    import math
    if num == 2 or num == 3:
        return True
    # 不在6的倍数两侧的一定不是质数
    if num % 6 != 1 and num % 6 != 5:
        return False
    # 取num的平均数
    tmp = int(math.sqrt(num))+1
    #在6的倍数的两侧的也可能不是质数
    for i in range(5, tmp, 6):
        if num % i == 0 or num % (i+2) == 0:
            return False
    #是质数
    return True
# print("zhishu:" , isprime(7))
for i in range(1 , zhengshu+1):
   if isprime(i):
       prime.append(i)
print(prime)
tmp=0
char=""
for i in range(1,len(prime)+1):
    tmp=tmp+prime[i]
    if tmp >1000:
        break
    if(isprime(tmp)):
        for j in range(1,i+1):
            char=char+"+"+str(prime[j])
        print(str(tmp),"=",char)
        char=''

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-6 23:20:38 | 显示全部楼层
def isprime(n):
    if n == 1:
        return False
    if n == 2 :
        return True

    for i in range(2,n//2 + 1):
        if n % i == 0:
            return False

    return True

result = []
primes = []
for i in range(2,1000):
    if isprime(i):
        primes.append(i)
for i in range(2,len(primes)+1):
    if isprime(sum(primes[:i])):
       
        result.append(sum(primes[:i]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-2 04:38:39 | 显示全部楼层
def isPrime(n):
    if n < 2:
        return False
    elif n == 2 or n == 3:
        return True
    else:
        for i in range(2, int(n**0.5)+1):
            if n%i == 0:
                return False
        return True

def fun(n):
    allPrimes = []
    for i in range(2, n+1):
        if isPrime(i):
            allPrimes.append(i)
            if sum(allPrimes) > n:
                break
    return [sum(allPrimes[0:i]) for i in range(1,len(allPrimes)) if isPrime(sum(allPrimes[0:i]))]

print(fun(1000))

[2, 5, 17, 41, 197, 281]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 17:54:56 | 显示全部楼层
def makeprimes(end):
  primelist=[True]*(end+1)
  primelist[0],primelist[1]=None,False
  for i,prime in enumerate(primelist[:int(end/2+1)]):
    if prime:
      for j in range(2*i,end+1,i):primelist[j]=False
  return[i for i,prime in enumerate(primelist)if prime]
i=2;l=makeprimes(500000);re=[];k=0
while k<1000:
        k=sum(l[:i])
        if k in l:re.append(k)
        i+=1
print(re)
[5, 17, 41, 197, 281]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-7 20:19:37 | 显示全部楼层
[2, 5, 17, 41, 197, 281]
def fun78():
    a=[]
    b=[]
    s=0
    for i in range(2,1000):
        for j in range(2,i):
            if i%j==0:
                break
        else:
            a.append(i)
            
    for i in range(len(a)):
        s+=a[i]
        if s in a:
            b.append(s)
    return b
print(fun78())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-3-8 10:23:51 | 显示全部楼层
def fun109(n):
    f = set()
    p, Sum = set(), 0
    for i in range(2, n + 1):
        for j in range(2, int(i ** 0.5) + 1):
            if i % j == 0:
                break
        else:
            f.add(i)
            Sum += i
            p.add(Sum)
            
    return f & p
    

print(fun109(1000))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 03:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表