鱼C论坛

 找回密码
 立即注册
查看: 4340|回复: 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个质数相加得到的质数列表。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

  2. def fun(n):
  3.     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)]]
  4.     acc_prime = set(accumulate(prime)) - {2} # 2 作为累加第一项多余
  5.     return set(prime) & acc_prime
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-2 20:31:49 | 显示全部楼层

  1. def primefactor(n):
  2.     lst = [i for i in range(2, n+1) if is_prime(i)]
  3.     nlst = []
  4.    
  5.     for i in range(2,len(lst)):
  6.         if sum(lst[:i]) > lst[-1]:
  7.             if is_prime(sum(lst[:i])):
  8.                 nlst.append(sum(lst[:i]))
  9.         elif sum(lst[:i]) in lst:
  10.             nlst.append((sum(lst[:i])))

  11.     return nlst

  12. def is_prime(n):
  13.     for i in range(2, n):
  14.         if n % i == 0:
  15.             return False
  16.     return True
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

又看了一遍题,发现和你理解有点区别。。貌似你理解的对的。。尴尬
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

审题,敲黑板,划重点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我可能没有写清楚,每次都是从2开始加。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-2 22:02:37 | 显示全部楼层
  1. def fun(n):
  2.     new_prime = []
  3.     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)]]
  4.     for i in range(1,len(prime)):
  5.         if sum(prime[:i+1]) in prime:
  6.             new_prime.append(sum(prime[:i+1]))
  7.     return new_prime
  8. print(fun(1000))
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-3 12:21:37 | 显示全部楼层
  1. #质数求和仍然为质数
  2. #求出1-1000的质数
  3. list1 = [2,3]
  4. sign = 0
  5. for i in range(2,1000):
  6.     for j in range(2,i//2 + 1):
  7.         if i % j != 0:
  8.             sign = 1
  9.         else:
  10.             sign = 0
  11.             break
  12.     if sign == 1:
  13.         list1.append(i)
  14. #print(list1)
  15. #求出质数加和还为质数
  16. length = len(list1)
  17. sum = 0
  18. list2 = []
  19. for i in range(length):
  20.     sum = sum + list1[i]
  21.     if sum > 1000:
  22.         break
  23.     elif (sum in list1):
  24.         list2.append(sum)

  25. print(list2)
复制代码

运行结果:[2, 5, 17, 41, 197, 281]

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  2. def primefactor(itertor):
  3.     return (i for i in itertor if 0 not in (i%j for j in range(2,int(i**0.5+1))))
  4. def main(n):
  5.     return list(primefactor(accumulate(primefactor(range(2,1000)[:n]))))
  6. if __name__ == "__main__":
  7.     print(main(1000))
复制代码
  1. [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

查看全部评分

小甲鱼最新课程 -> https://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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  9.     return True

  10. result = []
  11. primes = []
  12. for i in range(2,1000):
  13.     if isprime(i):
  14.         primes.append(i)
  15. for i in range(2,len(primes)+1):
  16.     if isprime(sum(primes[:i])):
  17.       
  18.         result.append(sum(primes[:i]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  11. def fun(n):
  12.     allPrimes = []
  13.     for i in range(2, n+1):
  14.         if isPrime(i):
  15.             allPrimes.append(i)
  16.             if sum(allPrimes) > n:
  17.                 break
  18.     return [sum(allPrimes[0:i]) for i in range(1,len(allPrimes)) if isPrime(sum(allPrimes[0:i]))]

  19. print(fun(1000))

  20. [2, 5, 17, 41, 197, 281]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 17:54:56 | 显示全部楼层
  1. def makeprimes(end):
  2.   primelist=[True]*(end+1)
  3.   primelist[0],primelist[1]=None,False
  4.   for i,prime in enumerate(primelist[:int(end/2+1)]):
  5.     if prime:
  6.       for j in range(2*i,end+1,i):primelist[j]=False
  7.   return[i for i,prime in enumerate(primelist)if prime]
  8. i=2;l=makeprimes(500000);re=[];k=0
  9. while k<1000:
  10.         k=sum(l[:i])
  11.         if k in l:re.append(k)
  12.         i+=1
  13. print(re)
复制代码
[5, 17, 41, 197, 281]
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-7 20:19:37 | 显示全部楼层
[2, 5, 17, 41, 197, 281]
  1. def fun78():
  2.     a=[]
  3.     b=[]
  4.     s=0
  5.     for i in range(2,1000):
  6.         for j in range(2,i):
  7.             if i%j==0:
  8.                 break
  9.         else:
  10.             a.append(i)
  11.             
  12.     for i in range(len(a)):
  13.         s+=a[i]
  14.         if s in a:
  15.             b.append(s)
  16.     return b
  17. print(fun78())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  15. print(fun109(1000))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 01:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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