鱼C论坛

 找回密码
 立即注册
查看: 5661|回复: 25

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

[复制链接]
发表于 2017-10-25 09:03:19 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2017-10-26 21:59 编辑

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

题目:
输入一个正整数n,建立一个有n个元素的列表,列表中的元素为4个质数之和,第0元素为第一个质数到第四个质素之和(2+3+5+7),第1个元素为第二个质数到第五个质素之和(3+5+7+11),第2个元素为第三个质数到第六个质素之和(5+7+11+13),以此类推。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-10-25 09:52:45 | 显示全部楼层
int1 = int(input('输入一个正整数:'))
list1 = []
list2 = []
def is_prime(x):
    if x == 1:
         return '' 
    for i in range(2, x):
        if x % i == 0:
             return ''
    return x
for y in range(2,9999):
     if y == is_prime(y):
          list2.append(y)
for n in range(int1):
     element = list2[n] + list2[n+1] + list2[n+2] + list2[n+3]
     list1.append(element)
print(list1)
         

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-25 10:08:01 | 显示全部楼层
本帖最后由 aegis1417 于 2017-10-25 10:13 编辑

#新手來試看看,鞭策小力一點
times=0
number=2  #從2開始 
count=1  #已包含2這個質數
p=[2]
key=int(input("請輸入n = "))
k=key+3
answer=[]

while count < k:

    times=0
    number=number+1
     
    for i in range(2,number):

        if number%i ==0:
            times=1

        if times==1:
            break
        
    if times == 0:
        count=count+1
        p.append(number)

        if len(p) == 4:
            answer.append(sum(p))
            del p[0]
               
        
print(answer)

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-25 10:29:38 | 显示全部楼层
本帖最后由 BngThea 于 2017-10-25 10:36 编辑
from math import sqrt

tar = int(input("Please enter a integer:"))

tarList = []
primeList = [2,3,5,7]

def check(n):
    if not (n % 2):
        return False
    i = 3
    while (i <= sqrt(n)):
        if not (n % i):
            return False
        i += 2
    return True

temp = 11
count = len(primeList) - 3
while count < tar:
    if check(temp):
        primeList.append(temp)
        count += 1
    temp += 2

for k in range(tar):
    tarList.append(sum(primeList[k:k+4]))

print(tarList)

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-25 15:02:51 | 显示全部楼层
def gen_primes(n):
    primes = [2,3,5,7]
    p = 7
    while len(primes)<n+3:
        p+=2
        for i in range(3,int(p**0.5+1)):
            if p%i==0: break
        else:
            primes.append(p)
    return [sum(primes[i:i+4]) for i in range(n)]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-25 15:37:40 | 显示全部楼层
def is_prime(n):
    for i in range(2,n):
        if n % i == 0:
            return False
    return True

def prime_list(n):
    prime = [2,3]
    a = 3
    while n:
        a += 2
        if is_prime(a):
            prime.append(a)
        if len(prime) == (n + 4):
            break
    return prime

def result_list(n):
    prime = prime_list(n)
    return [sum(prime[i:i+4]) for i in range(n)]

print(result_list(5))

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-25 15:42:30 | 显示全部楼层
def isprime(num):
    if num == 0 or num == 1:
        return False
    elif num == 2 or num == 3:
        return True
    else:
        for i in range(2,num//2 + 1):
            if num % i == 0:
                return False
    return True

def generate_primes(n):
    primes = []
    num = 2
    while len(primes) < n:
        if isprime(num):
            primes.append(num)
            num += 1
        else:
            num += 1
    return primes

def generate_prime_sum_list(n):
    result = []
    primes = generate_primes(n + 3)
    for i in range(n):
        result.append(sum(primes[i: i+4]))
    return result

print(generate_prime_sum_list(2))
print(generate_prime_sum_list(10))

[17, 26]
[17, 26, 36, 48, 60, 72, 88, 102, 120, 138]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-25 15:58:24 | 显示全部楼层
本帖最后由 colinshi 于 2017-10-27 10:30 编辑

修改一下提高一下效率
def FindZS(x,zs):#一个数(N)不能被小于根号N的数整除,那么这个数就是质数。
    for j in zs:
        if j > x**0.5:#所以当除数大于根号N的数时,跳出循环
            break
        if x%j == 0: #余数为0时,这个数就是合数返回False
            return False
    return True

#返回X以内的质数列表,6N±1法则
def zhisu(a):
    z = [2,3]
    for i in range(6,a*a,6):
        if FindZS(i-1,z) is True:
            z.append(i-1)
        if len(z) >= a:
            return z
        if FindZS(i+1,z) is True:
            z.append(i+1)
        if len(z) >= a:
            return z

a=int(input('输入一个正整数:',))
b=zhisu(a+4)
print(b)
c=[] 
import time
start=time.time()
for i in range(a):
    c.append(sum(b[i:i+4]))
print(c)
print(time.time()-start)

点评

运行报错,再修改一下。  发表于 2017-10-26 22:09
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-25 16:28:06 | 显示全部楼层
本帖最后由 SixPy 于 2017-10-25 16:29 编辑

http://www.lfd.uci.edu/~gohlke/pythonlibs/#gmpy
在此地址下载合适版本的 gmpy2 安装包
然后 pip install gmpy2的全路径安装包

gmpy2 是个开源,高效的,高精度大整数计算工具包。
它里面实现了很多种高效的素数测试方法。例如:
gmpy2.is_prime(536870911)
#False


本题用 next_prime
from gmpy2 import next_prime

def prm_sum(n):
    prms = [next_prime(0)]
    for i in range(1,n+3):
        prms.append(next_prime(prms[-1]))
    return [int(sum(prms[i:i+4]))for i in range(n)]
    
print(prm_sum(4))
#[17, 26, 36, 48]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-25 16:37:41 | 显示全部楼层
本帖最后由 SixPy 于 2017-10-25 16:40 编辑

素性测试算法——AKS算法
由三个印裔的哥们设计的(算法的名称取自他们的首字母)。
中文翻译:多项式时间内的素性确定算法
https://www.zybuluo.com/devilogic/note/131413

把源码也抄一份过来~
#!/usr/bin/python
# coding:utf-8
#import numpy as np
import math
import ysym
from ysym.ypolynomial import *
import gmpy2
def is_prime_by_AKS(n):
    """
    使用AKS算法确定n是否是一个素数
    True:n是素数
    False:n是合数
    """
    def __is_integer__(n):
        """
        判断一个数是否是整数
        """
        i = int(n)
        f = n - i
        return not f
    def __phi__(n):
        """
        欧拉函数,测试小于n并与n互素的个数
        """
        res = n
        a = n
        for i in range(2, a+1):
            if a % i == 0:
                res = res // i * (i - 1)
                while a % i == 0:
                    a //= i
        if a > 1:
            res = res // a * (a - 1)
        return res
    def __gcd__(a, b):
        """
        计算a b的最大公约数
        """
        if b == 0:
            return a
        return __gcd__(b, a % b)
    print("步骤1, 确定%d是否是纯次幂" % n)
    for b in range(2, math.floor(math.log2(n))+1):
        a = n**(1/b)
        if __is_integer__(a):
            return False
    print("步骤2,找到一个最小的r,符合o_r(%d) > (log%d)^2" % (n, n))
    maxk = math.floor(math.log2(n)**2)
    maxr = max(3, math.ceil(math.log2(n)**5))
    nextR = True
    r = 0
    for r in range(2, maxr):
        if nextR == False:
            break
        nextR = False
        for k in range(1, maxk+1):
            if nextR == True:
                break
            nextR = (gmpy2.mpz(n**k % r) == 0) or (gmpy2.mpz(n**k % r) == 1)
    r = r - 1 # 循环多增加了一层
    print("r = %d" % r)
    print("步骤3,如果 1 < gcd(a, %d) < %d,对于一些 a <= %d, 输出合数" % (n, n, r))
    for a in range(r, 1, -1):
        g = __gcd__(a, n)
        if g > 1 and g < n:
            return False
    print("步骤4,如果n=%d <= r=%d,输出素数" % (n, r))
    if n <= r:
        return True
    print("步骤5")
    print("遍历a从1到\sqrt{\phi(r=%d)}logn=%d" % (r, n))
    print("如果(X+a)^%d != X^%d+a mod {X^%d-1, %d}$输出合数" % (n, n, r, n))
    # 构造P = (X+a)^n mod (X^r-1)
    print("构造多项式(X+a)^%d,并且进行二项式展开" % n)
    X = multi_ysymbols('X')
    a = multi_ysymbols('a')
    X_a_n_expand = binomial_expand(ypolynomial1(X, a), n)
    print(X_a_n_expand)
    X.pow(r)
    reduce_poly = ypolynomial1(X, ysymbol(value=-1.0))
    print("构造消减多项式 %s" % reduce_poly)
    print("进行运算 (X+a)^%d mod (X^%d-1)" % (n, r))
    r_equ = ypolynomial_mod(X_a_n_expand, reduce_poly)
    print("得到余式: %s" % r_equ)
    print("进行运算'余式' mod %d 得到式(A)" % n)
    A = ypolynomial_reduce(r_equ, n)
    print("A = %s" % A)
    print("B = x^%d+a mod x^%d-1" % (n, r))
    B = ypolynomial1(multi_ysymbols('X', power=31), a)
    B = ypolynomial_mod(B, reduce_poly)
    print("B = %s" % B)
    C = ypolynomial_sub(A, B)
    print("C = A - B = %s" % C)
    maxa = math.floor(math.sqrt(__phi__(r)) * math.log2(n))
    print("遍历a = 1 to %d" % maxa)
    print("检查每个'%s = 0 (mod %d)'" % (C, n))
    for a in range(1, maxa+1):
        print("检查a = %d" % a)
        C.set_variables_value(a=a)
        v = C.eval()
        if v % n != 0:
            return False
    print("步骤6 输出素数")
    return True
if __name__ == "__main__":
    n = 31
    print("检查'%d'是否为素数" % n)
    result = is_prime_by_AKS(n)
    if result is True:
        print("YES")
    else:
        print("NO")
else:
    pass
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 08:12:21 | 显示全部楼层
学习中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 18:35:28 | 显示全部楼层
本帖最后由 口可口可 于 2017-10-27 11:31 编辑

重新修改一下,并优化了计算
list = []
prime_list = [2]

n = int(input("输入质数和的个数:"))

i=1
while (n+3) > len(prime_list):
    i+=2
    for j in range(3,int(i**0.5+1)):
        if (i % j ==0):break
    else:
        prime_list.append(i)

for a in range(n):
    list.append(sum(prime_list[a:a+4]))
    
print(list)
print(prime_list)
[17, 26, 36, 48, 60, 72, 88, 102, 120, 138]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41]

点评

结果有误  发表于 2017-10-26 22:10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-26 18:45:08 | 显示全部楼层
本帖最后由 wc365 于 2017-10-26 18:47 编辑
def is_prime(n):
  if n < 2:
    return False
  for i in range(2, int(n**0.5+1)):
    if n%i == 0:
      return False
  return True

def primesum(n):
  x = 2
  primelist = []
  while (n + 3)!= 0:
    if is_prime(x):
      primelist.append(x)
      n -= 1
      x += 1
    else:
      x += 1     
  return list(map(lambda a,b,c,d:a+b+c+d,primelist[:-3],primelist[1:-2],primelist[2:-1],primelist[3:]))

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-10-27 20:58:58 | 显示全部楼层
获取n+3个素数,然后前n个每相邻4个求和
def fun(n):
    prime_nums, num = [2,3,5], 7
    while len(prime_nums) < n + 3:
        for i in range(2, int(num**0.5) +1):
            if not num % i: break
        else:
            prime_nums.append(num)
        num += 2 # 偶数不用考虑了
    return [sum(prime_nums[i:i+4]) for i in range(n)]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-28 19:57:51 | 显示全部楼层
本帖最后由 JonTargaryen 于 2017-10-28 20:00 编辑

首先输入n,然后返回前n+3个素数
然后每四个相加后,附加到新的列表中


素数:
建立素数列表:第一个为2,第二个是3
在3的基础上每次&#10133;2,如果能够整除已有列表中的任意元素,继续+2,否则为素数,添加到列表中

import math

def all_prime(n):
    primes = [2]
    temp = 3
    is_prime = 1
    num = 1

    while num < n:
        for each in primes:
            if temp % each == 0:
                is_prime = 0
                break
        if is_prime:
            primes.append(temp)
            num += 1
        else:
            is_prime = 1
        temp += 2

    return primes

def main():
    n = int(input("please input the length: "))
    primes = all_prime(n+3)

    result = []

    for i in range(n):
        result.append(sum(primes[i:i+4]))

    print(result)

if __name__ == "__main__":
    main()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-29 00:20:51 | 显示全部楼层
受教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-30 08:02:11 | 显示全部楼层
def isPrime(n):    #判断是否是素数
    if n < 2:
        return False
    elif n == 2:
        return True
    else:
        for i in range(2, int(n**0.5)+1):
            if n % i == 0:
                return False
    return True


def getPrimeList(n):      # 求n+3个素数
    primeList = []
    number = 1
    while len(primeList) < n + 3:
        if isPrime(number):
            primeList.append(number)
        number += 1
    return primeList

def getList(n):   # 求所求列表
    return [sum(getPrimeList(n)[i:i+4]) for i in range(n)]


print(getList(3))


# Result: [17, 26, 36]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-1 11:13:41 | 显示全部楼层
def is_prime(x):
    for i in range(2,x):
        if x%i ==0:
            return False
        
    return True

n=int(input('please enter the value of n:'))

prime_count=[]
prime=[]

for i in range(2,10000):
    if is_prime(i)==True:
        prime.append(i)

for i in range(n):
    count=prime[i]+prime[i+1]+prime[i+2]+prime[i+3]
    prime_count.append(count)

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

使用道具 举报

发表于 2018-5-2 10:25:49 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-2 10:26:19 | 显示全部楼层
import math
from math import factorial
def prime(x):
    return  factorial(x-1) % x == x-1
def prime_list(n):
    prime_list = []
    for i in range(2,10*n):
        if prime(i):
            prime_list.append(i)
    print(prime_list)
    list1 = []
    for i in range(n):
        list1.append(sum(prime_list[i:i+4]))
    return list1
prime_list(10)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 05:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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