鱼C论坛

 找回密码
 立即注册
查看: 4849|回复: 19

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

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

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

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

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

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

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

题目:
我们知道质数是2, 3, 5, 7, 11, 13, 17, 19......
首先生成1000以内的质数列表,临近的质数相减都是偶数(除了3-2),我们把结果为质数或除2后为质数生成一个新的质数列表(例如差值为6,新列表中加入的是3),并去除重复的元素。
要求给出新列表,并由小到大排列。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-1-8 14:25:46 | 显示全部楼层
# -*- coding:utf-8 -*-

zs = [2, ]
for i in xrange(2, 1000):
    for temp in xrange(2, i):
        if i % temp == 0:
            break
        if temp == i - 1:
            zs.append(i)

nzs = []
for i in range(1, len(zs)):
    tmp = zs[i] - zs[i - 1]
    if tmp / 2 in zs:
        if tmp / 2 not in nzs:
            nzs.append(tmp / 2)

print sorted(nzs)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-8 16:06:24 | 显示全部楼层
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):
                if n % i == 0:
                    return False
            else:
                return True

primeInThousend = [2]
for i in range(3, 1000, 2):
    if isPrime(i):
        primeInThousend.append(i)

length = len(primeInThousend)

x = set([primeInThousend[1:][i] - primeInThousend[:length-1][i] for i in range(length-1)])
result = []
for i in x:
    if isPrime(i):
        result.append(i)
    elif isPrime(i//2):
        result.append(i//2)

print(sorted(list(set(result))))
    
#  result = [2, 3, 5, 7]
#  不知道是不是这个意思。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 是这个意思

查看全部评分

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

使用道具 举报

发表于 2018-1-8 17:15:52 | 显示全部楼层
from math import sqrt
def is_prime(n):
    if n<=1:
        return 0
    for i in range(2,int(sqrt(n))+1):
        if n%i==0:
            return 0
    return 1
def gg():
    li = []
    for n in range(1,1001):
        if is_prime(n):
            li.append(n)
    re = set()
    for i in range(1,len(li)):
        if is_prime(li[i]-li[i-1]):
            re.add(int(li[i]-li[i-1]))
        elif is_prime((li[i]-li[i-1])/2):
            re.add(int((li[i]-li[i-1])/2))
    print(re)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-8 18:56:45 | 显示全部楼层
本帖最后由 coopr 于 2018-1-8 18:59 编辑
#每日一题134
temp = 0 
zhishu = []
for i in range (1,1000):
        for j in range (2,i):
                sum = i % j
                if sum == 0:
                        temp = 1 
        if temp == 0:
                zhishu.append(i)
        temp = 0
print(zhishu)                                 #质数列表
lengths = len(zhishu)
list = []
for k in range(1,lengths):
        cha = zhishu[k] - zhishu[k-1]
        if cha %2 == 0:
                shang = cha//2
                if cha in zhishu and cha not in list:
                        list.append(cha)
                if shang in zhishu and shang not in list:
                        list.append(shang)
list.sort()
print(list)
                
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-8 19:58:36 | 显示全部楼层
from math import sqrt
def is_prime(n:int):
    for i in range(2, int(sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True
s = list(filter(is_prime, range(2, 1001)))
a = set()
for i in range(1, len(s)):
    tmp = s[i] - s[i - 1]
    if tmp in s:
        a.add(tmp)
    elif (tmp / 2).is_integer() and int(tmp / 2) in s:
        a.add(int(tmp / 2))
print(sorted(list(a)))

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-8 20:35:44 | 显示全部楼层
差值都是偶数,里面只有2一个质数吧
def fun(n):
    prime_nums = [i for i in range(2, n+1)
                 if 0 not in {i%j for j in range(2, int(i**0.5)+1)}]
    lst = {2 if j-i == 2 else (j-i)/2
           for i,j in zip(prime_nums, prime_nums[1:])}
    return sorted(num for num in lst if num in prime_nums)
之前的题目有鱼油介绍过gmpy2,模仿写一个
from gmpy2 import next_prime

def fun2(n):
    prms = [next_prime(0)]
    while prms[-1] <= n:
        prms.append(next_prime(prms[-1]))
    lst = {2 if j-i == 2 else (j-i)/2
           for i,j in zip(prms[:-1], prms[1:-1])}
    return sorted(num for num in lst if num in prms)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-8 20:58:17 | 显示全部楼层
kankan
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-8 21:38:58 | 显示全部楼层
def generate_primes(n):
    primes = [True] * n
    primes[0], primes[1] = False, False
    for (i, prime) in enumerate(primes):
        if prime:
            for j in range(i*i, n, i):
                primes[j] = False
    primes = [k for (k, prime) in enumerate(primes) if prime]
    return primes

def main():
    primes = generate_primes(1000)
    new_primes = []
    for i in range(1,len(primes)):
        difference = primes[i] - primes[i-1]
        if difference in primes and difference not in new_primes:
            new_primes.append(difference)
        elif difference % 2 == 0 and difference // 2 in primes and difference // 2 not in new_primes:
            new_primes.append(difference//2)
    new_primes.sort()
    print(new_primes)

if __name__ == '__main__':
    main()
结果:[2, 3, 5, 7]

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-8 21:41:15 | 显示全部楼层
import math
lsit1=[]
lsit2=[]
sr_num=0

for i in range (2,1000):
    fg=0
    for n in range(2,int(math.sqrt(i))+1):
        if i % n ==0:
            fg=1
            break
    if fg ==0:
        lsit1.append(i)
        
print(lsit1)
for i in range (len(lsit1)-1):
    nu= lsit1[i+1]-lsit1[i]
    if nu in lsit1:
        lsit2.append(nu)
    if nu//2 in lsit1:
        lsit2.append(nu//2)
print(set(lsit2))

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-9 19:47:05 | 显示全部楼层
求素数函数来自网络,是个“埃氏筛法”什么的,反正不是我写的。

def numsu(n):
    '''返回n以内的素数列表'''
    listdef=[]
    flag = [True]*(n+2)
    p=2
    while(p<=n):
        listdef.append(p)
        for i in range(2*p,n+1,p):
            flag[i] = False
        while 1:
            p += 1
            if flag[p]:
                break
    return listdef

list1=numsu(1000)
list2=[]
'''取素数列表两元素差的一半组成list2'''
for i in range(1,len(list1)):
    temp=int((list1[i]-list1[i-1])/2)
    list2.append(temp)
   
'''set排重'''
list2=list(set(list2))

'''是素数放入list3'''
list3=[]
for i in list2:
    if i in list1:
        list3.append(i)
print(list3)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-1-9 20:12:31 | 显示全部楼层
def is_sushu(num):
 res=True
 for x in range(2,num-1):
  if num%x==0:
   res=False
   return res
 return res
list1=[x for x in filter(is_sushu,range(2,1001))]
list2=[]
for x in list1:
    list2.append(x-list1[list1.index(x)-1])
list2.pop(0)
list3=set(list2)
list4=[]
for x in list3:
    if is_sushu(int(x/2)) and int(x/2)>0:
        list4.append(int(x/2))
print(list4)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 16:56:33 | 显示全部楼层
本帖最后由 h20060304 于 2018-1-14 17:17 编辑

在下不才,献丑了。
# 在质数列表中,除了第一个质数2为偶数外,均为奇数,故先生成一个无限的奇数序列,从而为后续可以生成无限素数,打下基础,摆脱局限性。

def _odd_iter():
    n = 1
    while True:
        n += 2
        yield n

# 根据“埃氏筛选法”,逐步筛出所有的素数。

def _not_divisible(n):
    return lambda x: x % n > 0


def primes():
    yield 2
    it = _odd_iter()
    while True:
        n = next(it)
        yield n
        it = filter(_not_divisible(n), it)

# 主程序,这里用first,和two,依次从素数序列中,取出两个元素,按照题目设定条件,进行筛查,并最终总返回结果。

def check_prime():
    prime = primes()
    first = next(prime)
    two = next(prime)
    lst = []
    while two < 1000:
        comp = [two - first, (two - first) // 2]
        for prime1 in primes():
            if comp[0] >= prime1:
                if prime1 in comp:
                    lst.append(prime1)
                    continue
            else:
                break
        first, two = two, next(prime)
    lst = set(lst)
    print('运行结果:{}'.format(lst))


check_prime()


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

使用道具 举报

发表于 2018-1-16 22:34:40 | 显示全部楼层
def primeNum(low,upper):
    num=[]
    for i in range(low,upper+1):
        fg=0

        for j in range(2,i):
            if i%j==0:
                fg=1
                break
        if fg==0:
            num.append(i)
    return num
   
def fun(list1):
    new=[]
    for i in range(1,len(list1)):
        x=list1[i]-list1[i-1]
        
        if x in list1:
            new.append(int(x))
            
            
        elif x/2 in list1:
            new.append(int(x/2))
    return new
   
            


list1=primeNum(1,1001)
list3=list(set(fun(list1)))

print(list3)

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

使用道具 举报

发表于 2018-2-5 22:04:17 | 显示全部楼层
萌新
import math
def prime(n):
    if n == 2 or n == 3:
         return True
    i = int(math.sqrt(abs(n)))
    while i >1:
        if n % i == 0:
            return False
            break
        else:
            i -= 1
            if i < 2:
                return True
def main():
    a = []
    b = []
    for i in range(1, 1000):
        if prime(i):
            a.append(i)    
    for p in range(2, len(a)):
        m = (a[p] - a[p-1])/2
        if prime(m) == True :
            if m not in b:
                b.append(m)
    b.sort()
    print(b)
main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-8 16:44:55 | 显示全部楼层
def isPrime(n):
    for i in range(2, int(n**0.5)+1):
        if n%i == 0: return False
    return n>=2

def f(n):
    S = set()
    L = [x for x in range(2, n+1) if isPrime(x)]
    for i in range(len(L)-1):
        if isPrime(L[i+1] - L[i]):
            S.add(L[i+1] - L[i])
        elif isPrime((L[i+1] - L[i])/2):
            S.add(int((L[i+1] - L[i])/2))
    return sorted(list(S))

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

使用道具 举报

发表于 2018-3-26 18:38:59 | 显示全部楼层
本帖最后由 fan1993423 于 2018-3-26 18:40 编辑

m=[]
for a in range(2,1001):
    if a==2:
       m.append(a)
    else:
        if 0 not in [a%b for b in range(2,a)] :
                m.append(a)
i=1
l=[]
while i<=len(m)-2:
    if m[i+1]-m[i] in m:
        l.append(m[i+1]-m[i])
    elif (m[i+1]-m[i])//2 in m:
                 l.append((m[i+1]-m[i])//2)
    i+=1
print(list(set(l)))

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

使用道具 举报

发表于 2018-3-26 18:41:04 | 显示全部楼层
<m=[]
for a in range(2,1001):
    if a==2:
       m.append(a)
    else:
        if 0 not in [a%b for b in range(2,a)] :
                m.append(a)
i=1
l=[]
while i<=len(m)-2:
    if m[i+1]-m[i] in m:
        l.append(m[i+1]-m[i])
    elif (m[i+1]-m[i])//2 in m:
                 l.append((m[i+1]-m[i])//2)
    i+=1
l=set(l)
print(list(l))>        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-3 23:10:32 | 显示全部楼层
#coding=utf-8

primeList = []
primeNew = []

#生成质数
def getPrime() :
        for i in range(2, 1001) :
                flag = 0
                for j in range(2, i + 1) :
                        if i % j == 0 :
                                flag += 1
                if flag < 2 :
                        primeList.append(i)

#质数判定并返回
def primeConfirm(n) :
        flag = 0
        for i in range(2, n + 1) :
                if n % i == 0 :
                        flag += 1
        if flag < 2 :
                primeNew.append(n)

#质数差值计算
def start() :
        getPrime()
        tempList = []
        tempIndex = 0
        for i in primeList :
                tempIndex = primeList.index(i)
                if tempIndex > 1 :
                         tempList.append(i - primeList[tempIndex - 1])
        for i in tempList :
                if i % 2 != 0 :
                        primeConfirm(i)
                else :
                        primeConfirm(i // 2)
        print(set(primeNew))

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

使用道具 举报

发表于 2022-3-9 13:58:53 | 显示全部楼层
def fun134(n):   
    p = []
    for i in range(2, n + 1):
        for j in range(2, int(i ** 0.5) + 1):
            if i % j == 0:
                break
        else:
            p.append(i)
    #print(p)

    s = set(p)
    ans = set()
    for i in range(1, len(p)):
        cur = p[i] - p[i - 1]
        if cur in s:
            ans.add(cur)
        if cur / 2 in s:
            ans.add(cur // 2)
            
    return sorted(ans)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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