鱼C论坛

 找回密码
 立即注册
查看: 6782|回复: 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 编辑
def isPrime(n):
    if n == 2 or n == 3:
        return True
    elif n > 3:
        if n % 2 == 0:
            return False
        else:
            for i in range(3, int(n**0.5)+1, 2):
                if n % i == 0:
                    return False
            else:
                return True


def canDivide(n):
    if isPrime(n-2):
        print(n,'=',2,'+',n-2)
        return True
    else:
        for i in range(3, n, 2):
            if isPrime(i):
                if isPrime(n - i):
                    print(n,'=',i,'+',n-i)
                    return True
        else:
            print(n,"Can't Divide to 2 primes.")
            return False

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


##    5 = 2 + 3
##    6 = 3 + 3
##    8 = 3 + 5
##    13 = 2 + 11
##    14 = 3 + 11
##    15 = 2 + 13
##    16 = 3 + 13
##    17 Can't Divide to 2 primes.
##    20 = 3 + 17
##    21 = 2 + 19
##    24 = 5 + 19
##    26 = 3 + 23
##    27 Can't Divide to 2 primes.
##    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 | 显示全部楼层
number_1 = [5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
prime = []
answer = []

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

def in_answer(n,list1):
    for i in list1:
        a = n - i
        if a in list1:
            return True

for i in range(2,30):
    a = is_prime(i)
    if a :
        prime.append(i)
        
for i in number_1 :
    b = in_answer(i,prime)
    if b :
        answer.append(i)

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 编辑
#!/usr/bin/python
# -*- coding: utf-8 -*-
nmb = (5,6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30)
prime = (2,3,5,7,11,13,17,19,23)
#这么写算不算作弊....上次我看那个print(4/7)都行
result=dict()
for i in nmb:
        for j in prime:
                for k in prime:
                        if j+k==i:
                                #print("{0}+{1}={2}".format(j,k,i))
                                result[i]=0
for i in result:
        print(i)

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

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

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

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

筛选出能够分解成两个质数之和数组[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 | 显示全部楼层
a = [5, 6, 8, 13, 14, 15, 16, 17, 20, 21, 24, 26, 27, 30]
# 先来个质数判断
def is_prime(n):
    for i in range(2,n):
        if n % i == 0:
            return False
    return True
#能生成的质数
mx = max(a)
primeList = list()
for i in range(2,mx+1):
    if is_prime(i):
        primeList.append(i)
for i in a:
    for j in primeList:
        if i-j in primeList and i > j:
            print("满足条件的:" + str(i), "质数:" + str(j), "质数:" + str(i-j))
            #当出现6的时候会有两个相同的质数,如果不满足可以再加条件
            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 | 显示全部楼层
从质数组合入手不知道会不会快一点
def fun(lst):
    prime_nums = [i for i in range(2, max(lst)+1)
                  if 0 not in {i%j for j in range(2, int(i**0.5)+1)}]
    sums = {i+j for i in prime_nums for j in prime_nums}
    return set(lst) & sums

评分

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

查看全部评分

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

使用道具 举报

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

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

if __name__ == '__main__':
    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, 2025-1-12 04:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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