鱼C论坛

 找回密码
 立即注册
查看: 5568|回复: 29

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

[复制链接]
发表于 2018-1-10 08:48:42 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-1-11 20:14 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
这回还是与质数有关的题。
对于下列的一组数字,筛选出能够分解成两个质数之和的,如9可以分解为2+7,而11则无法分解成两个质数之和
5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-1-10 09:06:38 | 显示全部楼层
本帖最后由 shigure_takimi 于 2018-1-10 11:39 编辑
  1. def isPrime(n):
  2.     if n == 2 or n == 3:
  3.         return True
  4.     elif n > 3:
  5.         if n % 2 == 0:
  6.             return False
  7.         else:
  8.             for i in range(3, int(n**0.5)+1, 2):
  9.                 if n % i == 0:
  10.                     return False
  11.             else:
  12.                 return True


  13. def canDivide(n):
  14.     if isPrime(n-2):
  15.         print(n,'=',2,'+',n-2)
  16.         return True
  17.     else:
  18.         for i in range(3, n, 2):
  19.             if isPrime(i):
  20.                 if isPrime(n - i):
  21.                     print(n,'=',i,'+',n-i)
  22.                     return True
  23.         else:
  24.             print(n,"Can't Divide to 2 primes.")
  25.             return False

  26. numbers = [5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
  27. for i in numbers:
  28.     canDivide(i)


  29. ##    5 = 2 + 3
  30. ##    6 = 3 + 3
  31. ##    8 = 3 + 5
  32. ##    13 = 2 + 11
  33. ##    14 = 3 + 11
  34. ##    15 = 2 + 13
  35. ##    16 = 3 + 13
  36. ##    17 Can't Divide to 2 primes.
  37. ##    20 = 3 + 17
  38. ##    21 = 2 + 19
  39. ##    24 = 5 + 19
  40. ##    26 = 3 + 23
  41. ##    27 Can't Divide to 2 primes.
  42. ##    30 = 7 + 23
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 09:48:24 | 显示全部楼层
本帖最后由 jfmlj 于 2018-1-10 09:58 编辑


list1=[5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]

list2=[]
list3=[]

for i in range(0,30):
    for j in range(2,30):
        if i==j:
            list2.append(i)
        elif i%j==0:
            break

for i in list2:
    for j in list2:
        if (i+j) in list1:
            list3.append(i+j)

list3=set(list3)
print(list3)


{5, 6, 8, 13, 14, 15, 16, 20, 21, 24, 26, 30}
找不到哪里设置权限可见。。。

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 10:33:30 | 显示全部楼层
  1. number_1 = [5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
  2. prime = []
  3. answer = []

  4. def is_prime(n):
  5.     if n == 1:
  6.         return False
  7.     for i in range(2,n-1):
  8.         if n % i == 0:
  9.             return False
  10.     return True

  11. def in_answer(n,list1):
  12.     for i in list1:
  13.         a = n - i
  14.         if a in list1:
  15.             return True

  16. for i in range(2,30):
  17.     a = is_prime(i)
  18.     if a :
  19.         prime.append(i)
  20.         
  21. for i in number_1 :
  22.     b = in_answer(i,prime)
  23.     if b :
  24.         answer.append(i)

  25. print (answer)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 11:23:52 | 显示全部楼层
#对于下列的一组数字,筛选出能够分解成两个质数之和的,如9可以分解为2+7,而11则无法分解成两个质数之和
#5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30
from math import *
#找出30以内的质数
prime = [ ]
for x in range(2,30):
        n = int(sqrt(x)) + 1
        for y in range(2,n+1):
                if y == n:
                        prime.append(x)
                if x % y == 0:
                        break       
#筛选出分解成两个质数之和的数       
out = [ ]
number = [5,6,8,13,14,15,16,17,20,21,24,26,27,30]
for num in number:
        for i in prime:
                for j in prime:
                        if num == i + j:
                                #print(num,'=',i,'+',j)
                                out.append(num)

#去除重复的元素
i = 0
print(out)
while i < len(out):
        if i + 1 >= len(out):
                break
        if out[i] == out[i+1]:
                del out[i+1]
                continue
        else:
                i += 1
print(out)


评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 12:03:30 | 显示全部楼层
本帖最后由 cnkizy 于 2018-1-10 18:26 编辑
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. nmb = (5,6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30)
  4. prime = (2,3,5,7,11,13,17,19,23)
  5. #这么写算不算作弊....上次我看那个print(4/7)都行
  6. result=dict()
  7. for i in nmb:
  8.         for j in prime:
  9.                 for k in prime:
  10.                         if j+k==i:
  11.                                 #print("{0}+{1}={2}".format(j,k,i))
  12.                                 result[i]=0
  13. for i in result:
  14.         print(i)
复制代码


学汇编路过这个板块 看到刚出炉的题 顺便练练手

时间复杂度 我猜猜应该是 O(n3)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 13:11:06 | 显示全部楼层
  1. numbers = (5,6,8,13,14,15,16,17,20,21,24,26,27,30)
  2. primeNumbers = (2,3,5,7,11,13,17,19,23,29) #质数
  3. SPN = {}
  4. spn = []
  5. #筛选数据函数
  6. def screen ():
  7.     for num in numbers :
  8.         for Pnum in primeNumbers :
  9.             if Pnum > num or Pnum == num :
  10.                 index = primeNumbers.index(Pnum)
  11.                 break
  12.         x = primeNumbers [0:index]
  13.         y = primeNumbers [0:index]
  14.         temp = [(a,b) for a in x
  15.                 for b in y
  16.                 if a+b == num]
  17.         if temp :
  18.             SPN[str(num)] = temp
  19.             spn.append (num)
  20.     print ('下面是两个质数组合的可能性\n',SPN,
  21.            '\n下面是可以筛选出来的数字\n',spn)
  22. if __name__ == '__main__':
  23.     screen()
复制代码
捕获.PNG

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 14:00:13 | 显示全部楼层
  1. lst = [5,6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
  2. primes = [2,3,5,7,11,13,17,19,23]
  3. from itertools import combinations_with_replacement as cwr
  4. for i,j in cwr(primes,2):
  5.         if i+j in lst:
  6.                 print(i+j,i,j)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 15:17:28 | 显示全部楼层
  1. list1 = [5,6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
  2. shu = []
  3. import math
  4. def sushu(num):
  5.     if num == 2:
  6.         return 2
  7.     if num<2:
  8.         return
  9.     for i in range(2,int(math.sqrt(num))+1):
  10.         if num % i == 0:
  11.             return
  12.     return num
  13. for i in range(2, list1[-1]+1):
  14.     if sushu(i) != None:
  15.         shu.append(sushu(i))
  16. c = []
  17. for i in range(len(list1)-1):
  18.     j = 0
  19.     while (list1[i]-shu[j]) > 0:
  20.         if shu[j] != (list1[i]-shu[j]) and (list1[i]-shu[j]) in shu:
  21.             c.append(list1[i])
  22.             break
  23.         j += 1
  24. print(c)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 16:10:09 | 显示全部楼层
  1. list1=[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
  2. list2=[5,6,8,13,14,15,16,17,20,21,26,27,30]
  3. for i in list2:
  4.     for j in list1:
  5.         if i > j:
  6.             if i -j in list1:
  7.                 print(i)
  8.                 break
复制代码

结果包含了两个相同素数相加的情况

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 16:27:32 | 显示全部楼层
本帖最后由 紫夜之恋 于 2018-1-10 16:31 编辑

def prime(x):
    for i in range(2, x//2+1):
        if not x%i:
            return False
    return True

list2 = []

def primeAdd(x):
    for each in x:
        for i in range(each//2):
            number1 = i+1
            number2 = each-number1
            if prime(number1) and prime(number2):
                list2.append(each)
                break

    print(list2)
    list2.clear()

list1 = [5,6,8,13,14,15,16,17,20,21,24,26,27,30]
primeAdd(list1)

[5, 6, 8, 13, 14, 15, 16, 20, 21, 24, 26, 30]

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 16:30:50 | 显示全部楼层
  1. lists = [5, 6, 8,13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
  2. data = []
  3. for i,n in enumerate(lists):
  4.     n1 = 0
  5.     for j in range(2,n+1):
  6.         #什么是质数,除了1和它本身不能被任何数整除
  7.         #去除偶数和奇数
  8.         if (j%2)!=0 or (j%3)!=0 or j ==2 or j == 3:
  9.             if (n1 > 0):
  10.                 if n == (n1+j):
  11.                     data.append(n)
  12.             else:
  13.                 n1 = j

  14. print('筛选出能够分解成两个质数之和数组%s' %data)

  15. 筛选出能够分解成两个质数之和数组[5, 6, 13, 15, 16, 17, 21, 24, 27, 30]
复制代码

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

使用道具 举报

发表于 2018-1-10 19:40:12 | 显示全部楼层
x=[5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]

num=[]

for i in range(2,100):  
   for j in range(2,i):
      if(i%j==0):
         break
   else:
      num.append(i)
print(num)

y=[]
for m in x:
    for j in num:
        for k in num:
            if m==j+k :
                 print(m)
                 y.append(m)
                 print(j,k)
            else:
                break
            
print(y)
[5, 13, 15, 21]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-10 19:42:20 | 显示全部楼层
  1. a = [5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
  2. # 先来个质数判断
  3. def is_prime(n):
  4.     for i in range(2,n):
  5.         if n % i == 0:
  6.             return False
  7.     return True
  8. #能生成的质数
  9. mx = max(a)
  10. primeList = list()
  11. for i in range(2,mx+1):
  12.     if is_prime(i):
  13.         primeList.append(i)
  14. for i in a:
  15.     for j in primeList:
  16.         if i-j in primeList and i > j:
  17.             print("满足条件的:" + str(i), "质数:" + str(j), "质数:" + str(i-j))
  18.             #当出现6的时候会有两个相同的质数,如果不满足可以再加条件
  19.             break
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 19:48:59 | 显示全部楼层
list1 = [5,6,8,11,13,14,15,16,17,20,21,24,26,27,30]
list2 = [1,2,3,5,7,11,13,17,19,23,29] #(0~30以内的质数)
list3 = []
for i in list1:
    for m in list2:
        n = i - m
        if n in list2:
            list3.append(i)
            break
print(list3)

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 直接给出了质数

查看全部评分

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

使用道具 举报

发表于 2018-1-10 20:07:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-1-10 21:42:06 | 显示全部楼层
从质数组合入手不知道会不会快一点
  1. def fun(lst):
  2.     prime_nums = [i for i in range(2, max(lst)+1)
  3.                   if 0 not in {i%j for j in range(2, int(i**0.5)+1)}]
  4.     sums = {i+j for i in prime_nums for j in prime_nums}
  5.     return set(lst) & sums
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-10 22:27:39 | 显示全部楼层
  1. def generate_primes(n):
  2.     primes = [True] * n
  3.     primes[0], primes[1] = False, False
  4.     for (i, p) in enumerate(primes):
  5.         if p:
  6.             for j in range(i*i, n, i):
  7.                 primes[j] = False
  8.     return [k for (k, p) in enumerate(primes) if p]

  9. def main():
  10.     nums = [5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
  11.     primes = generate_primes(max(nums))
  12.     for each in nums:
  13.         #print(each)
  14.         for prime in primes:
  15.             #print("prime", prime)
  16.             result = each - prime
  17.             if result > 0 and result in primes and result != prime:
  18.                 print(each, prime, result)
  19.                 break

  20. if __name__ == '__main__':
  21.     main()
复制代码

结果:5 2 3
8 3 5
13 2 11
14 3 11
15 2 13
16 3 13
20 3 17
21 2 19
24 5 19
26 3 23
30 7 23

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-11 08:50:59 | 显示全部楼层
primelist=[2,3,5,7,11,13,17,19,23,29]

group1=[5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]

checklist=[]
for sum1 in group1:
        for prime1 in primelist:
                for prime2 in primelist:
                        if prime1+prime2==sum1:
                                if prime1<=prime2:
                                        print('{0}={1}+{2}'.format(sum1,prime1,prime2))
                                if sum1 not in checklist:
                                        checklist.append(sum1)
                                       
print(checklist)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-11 09:23:14 | 显示全部楼层
def isprime(num):
    count=num//2
    while count>1:
        if num % count ==0:
            return False
            break
        else:
            count-=1
    if count==1:
        return True
a=[5, 6, 8, 9, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
for k in range(0,14):
    for i in range(1,a[k]+1):
        if (isprime(a[k]-i)) and (isprime(i)):
            print('%d=%d+%d'%(a[k],i,a[k]-i))
            break

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 09:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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