冬雪雪冬 发表于 2017-10-25 09:03:19

Python:每日一题 116

本帖最后由 冬雪雪冬 于 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),以此类推。

zata 发表于 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 + list2 + list2 + list2
   list1.append(element)
print(list1)
         

aegis1417 发表于 2017-10-25 10:08:01

本帖最后由 aegis1417 于 2017-10-25 10:13 编辑

#新手來試看看,鞭策小力一點

times=0
number=2#從2開始
count=1#已包含2這個質數
p=
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
               
      
print(answer)

BngThea 发表于 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 =

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))

print(tarList)

jerryxjr1220 发表于 2017-10-25 15:02:51

def gen_primes(n):
    primes =
    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 ) for i in range(n)]

bush牛 发表于 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 =
    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 ) for i in range(n)]

print(result_list(5))

wyp02033 发表于 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))
    return result

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


colinshi 发表于 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 =
    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))
print(c)
print(time.time()-start)

SixPy 发表于 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 =
    for i in range(1,n+3):
      prms.append(next_prime(prms[-1]))
    return ))for i in range(n)]
   
print(prm_sum(4))
#

SixPy 发表于 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

YC777 发表于 2017-10-26 08:12:21

学习中

口可口可 发表于 2017-10-26 18:35:28

本帖最后由 口可口可 于 2017-10-27 11:31 编辑

重新修改一下,并优化了计算

list = []
prime_list =

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))
   
print(list)
print(prime_list)


wc365 发表于 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,primelist,primelist))

solomonxian 发表于 2017-10-27 20:58:58

获取n+3个素数,然后前n个每相邻4个求和
def fun(n):
    prime_nums, num = , 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 ) for i in range(n)]

JonTargaryen 发表于 2017-10-28 19:57:51

本帖最后由 JonTargaryen 于 2017-10-28 20:00 编辑

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


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


import math

def all_prime(n):
    primes =
    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))

    print(result)

if __name__ == "__main__":
    main()

YINXINGSHU 发表于 2017-10-29 00:20:51

受教了{:10_256:}

shigure_takimi 发表于 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 ) for i in range(n)]


print(getList(3))


# Result:

PYTHON90小菜鸟 发表于 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+prime+prime+prime
    prime_count.append(count)

print(prime_count)

新手潘包邮 发表于 2018-5-2 10:25:49

jerryxjr1220 发表于 2017-10-25 15:02


跪拜大佬

新手潘包邮 发表于 2018-5-2 10:26:19

import math
from math import factorial
def prime(x):
    returnfactorial(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))
    return list1
prime_list(10)
页: [1] 2
查看完整版本: Python:每日一题 116