Python:每日一题 135
本帖最后由 冬雪雪冬 于 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 本帖最后由 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 =
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
本帖最后由 jfmlj 于 2018-1-10 09:58 编辑
list1=
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}
找不到哪里设置权限可见。。。 number_1 =
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) #对于下列的一组数字,筛选出能够分解成两个质数之和的,如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 =
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 == out:
del out
continue
else:
i += 1
print(out)
本帖最后由 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=0
for i in result:
print(i)
学汇编路过这个板块 看到刚出炉的题 顺便练练手
时间复杂度 我猜猜应该是 O(n3) 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
y = primeNumbers
temp = [(a,b) for a in x
for b in y
if a+b == num]
if temp :
SPN = temp
spn.append (num)
print ('下面是两个质数组合的可能性\n',SPN,
'\n下面是可以筛选出来的数字\n',spn)
if __name__ == '__main__':
screen() lst =
primes =
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) list1 =
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-shu) > 0:
if shu != (list1-shu) and (list1-shu) in shu:
c.append(list1)
break
j += 1
print(c) list1=
list2=
for i in list2:
for j in list1:
if i > j:
if i -j in list1:
print(i)
break
结果包含了两个相同素数相加的情况 本帖最后由 紫夜之恋 于 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 =
primeAdd(list1)
lists =
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)
筛选出能够分解成两个质数之和数组
x=
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)
a =
# 先来个质数判断
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 list1 =
list2 = #(0~30以内的质数)
list3 = []
for i in list1:
for m in list2:
n = i - m
if n in list2:
list3.append(i)
break
print(list3) {:10_266:} 从质数组合入手不知道会不会快一点
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 def generate_primes(n):
primes = * n
primes, primes = False, False
for (i, p) in enumerate(primes):
if p:
for j in range(i*i, n, i):
primes = False
return
def main():
nums =
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 primelist=
group1=
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) 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=
for k in range(0,14):
for i in range(1,a+1):
if (isprime(a-i)) and (isprime(i)):
print('%d=%d+%d'%(a,i,a-i))
break
页:
[1]
2