鱼C论坛

 找回密码
 立即注册
查看: 4931|回复: 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 | 显示全部楼层
  1. int1 = int(input('输入一个正整数:'))
  2. list1 = []
  3. list2 = []
  4. def is_prime(x):
  5.     if x == 1:
  6.          return ''
  7.     for i in range(2, x):
  8.         if x % i == 0:
  9.              return ''
  10.     return x
  11. for y in range(2,9999):
  12.      if y == is_prime(y):
  13.           list2.append(y)
  14. for n in range(int1):
  15.      element = list2[n] + list2[n+1] + list2[n+2] + list2[n+3]
  16.      list1.append(element)
  17. print(list1)
  18.          
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

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

  1. times=0
  2. number=2  #從2開始
  3. count=1  #已包含2這個質數
  4. p=[2]
  5. key=int(input("請輸入n = "))
  6. k=key+3
  7. answer=[]

  8. while count < k:

  9.     times=0
  10.     number=number+1
  11.      
  12.     for i in range(2,number):

  13.         if number%i ==0:
  14.             times=1

  15.         if times==1:
  16.             break
  17.         
  18.     if times == 0:
  19.         count=count+1
  20.         p.append(number)

  21.         if len(p) == 4:
  22.             answer.append(sum(p))
  23.             del p[0]
  24.                
  25.         
  26. print(answer)
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

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

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

  5. def check(n):
  6.     if not (n % 2):
  7.         return False
  8.     i = 3
  9.     while (i <= sqrt(n)):
  10.         if not (n % i):
  11.             return False
  12.         i += 2
  13.     return True

  14. temp = 11
  15. count = len(primeList) - 3
  16. while count < tar:
  17.     if check(temp):
  18.         primeList.append(temp)
  19.         count += 1
  20.     temp += 2

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

  23. print(tarList)
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

  6. def prime_list(n):
  7.     prime = [2,3]
  8.     a = 3
  9.     while n:
  10.         a += 2
  11.         if is_prime(a):
  12.             prime.append(a)
  13.         if len(prime) == (n + 4):
  14.             break
  15.     return prime

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

  19. print(result_list(5))
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

  11. def generate_primes(n):
  12.     primes = []
  13.     num = 2
  14.     while len(primes) < n:
  15.         if isprime(num):
  16.             primes.append(num)
  17.             num += 1
  18.         else:
  19.             num += 1
  20.     return primes

  21. def generate_prime_sum_list(n):
  22.     result = []
  23.     primes = generate_primes(n + 3)
  24.     for i in range(n):
  25.         result.append(sum(primes[i: i+4]))
  26.     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 编辑

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

  8. #返回X以内的质数列表,6N±1法则
  9. def zhisu(a):
  10.     z = [2,3]
  11.     for i in range(6,a*a,6):
  12.         if FindZS(i-1,z) is True:
  13.             z.append(i-1)
  14.         if len(z) >= a:
  15.             return z
  16.         if FindZS(i+1,z) is True:
  17.             z.append(i+1)
  18.         if len(z) >= a:
  19.             return z

  20. a=int(input('输入一个正整数:',))
  21. b=zhisu(a+4)
  22. print(b)
  23. c=[]
  24. import time
  25. start=time.time()
  26. for i in range(a):
  27.     c.append(sum(b[i:i+4]))
  28. print(c)
  29. 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
  1. from gmpy2 import next_prime

  2. def prm_sum(n):
  3.     prms = [next_prime(0)]
  4.     for i in range(1,n+3):
  5.         prms.append(next_prime(prms[-1]))
  6.     return [int(sum(prms[i:i+4]))for i in range(n)]
  7.    
  8. print(prm_sum(4))
  9. #[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

把源码也抄一份过来~
  1. #!/usr/bin/python
  2. # coding:utf-8
  3. #import numpy as np
  4. import math
  5. import ysym
  6. from ysym.ypolynomial import *
  7. import gmpy2
  8. def is_prime_by_AKS(n):
  9.     """
  10.     使用AKS算法确定n是否是一个素数
  11.     True:n是素数
  12.     False:n是合数
  13.     """
  14.     def __is_integer__(n):
  15.         """
  16.         判断一个数是否是整数
  17.         """
  18.         i = int(n)
  19.         f = n - i
  20.         return not f
  21.     def __phi__(n):
  22.         """
  23.         欧拉函数,测试小于n并与n互素的个数
  24.         """
  25.         res = n
  26.         a = n
  27.         for i in range(2, a+1):
  28.             if a % i == 0:
  29.                 res = res // i * (i - 1)
  30.                 while a % i == 0:
  31.                     a //= i
  32.         if a > 1:
  33.             res = res // a * (a - 1)
  34.         return res
  35.     def __gcd__(a, b):
  36.         """
  37.         计算a b的最大公约数
  38.         """
  39.         if b == 0:
  40.             return a
  41.         return __gcd__(b, a % b)
  42.     print("步骤1, 确定%d是否是纯次幂" % n)
  43.     for b in range(2, math.floor(math.log2(n))+1):
  44.         a = n**(1/b)
  45.         if __is_integer__(a):
  46.             return False
  47.     print("步骤2,找到一个最小的r,符合o_r(%d) > (log%d)^2" % (n, n))
  48.     maxk = math.floor(math.log2(n)**2)
  49.     maxr = max(3, math.ceil(math.log2(n)**5))
  50.     nextR = True
  51.     r = 0
  52.     for r in range(2, maxr):
  53.         if nextR == False:
  54.             break
  55.         nextR = False
  56.         for k in range(1, maxk+1):
  57.             if nextR == True:
  58.                 break
  59.             nextR = (gmpy2.mpz(n**k % r) == 0) or (gmpy2.mpz(n**k % r) == 1)
  60.     r = r - 1 # 循环多增加了一层
  61.     print("r = %d" % r)
  62.     print("步骤3,如果 1 < gcd(a, %d) < %d,对于一些 a <= %d, 输出合数" % (n, n, r))
  63.     for a in range(r, 1, -1):
  64.         g = __gcd__(a, n)
  65.         if g > 1 and g < n:
  66.             return False
  67.     print("步骤4,如果n=%d <= r=%d,输出素数" % (n, r))
  68.     if n <= r:
  69.         return True
  70.     print("步骤5")
  71.     print("遍历a从1到\sqrt{\phi(r=%d)}logn=%d" % (r, n))
  72.     print("如果(X+a)^%d != X^%d+a mod {X^%d-1, %d}$输出合数" % (n, n, r, n))
  73.     # 构造P = (X+a)^n mod (X^r-1)
  74.     print("构造多项式(X+a)^%d,并且进行二项式展开" % n)
  75.     X = multi_ysymbols('X')
  76.     a = multi_ysymbols('a')
  77.     X_a_n_expand = binomial_expand(ypolynomial1(X, a), n)
  78.     print(X_a_n_expand)
  79.     X.pow(r)
  80.     reduce_poly = ypolynomial1(X, ysymbol(value=-1.0))
  81.     print("构造消减多项式 %s" % reduce_poly)
  82.     print("进行运算 (X+a)^%d mod (X^%d-1)" % (n, r))
  83.     r_equ = ypolynomial_mod(X_a_n_expand, reduce_poly)
  84.     print("得到余式: %s" % r_equ)
  85.     print("进行运算'余式' mod %d 得到式(A)" % n)
  86.     A = ypolynomial_reduce(r_equ, n)
  87.     print("A = %s" % A)
  88.     print("B = x^%d+a mod x^%d-1" % (n, r))
  89.     B = ypolynomial1(multi_ysymbols('X', power=31), a)
  90.     B = ypolynomial_mod(B, reduce_poly)
  91.     print("B = %s" % B)
  92.     C = ypolynomial_sub(A, B)
  93.     print("C = A - B = %s" % C)
  94.     maxa = math.floor(math.sqrt(__phi__(r)) * math.log2(n))
  95.     print("遍历a = 1 to %d" % maxa)
  96.     print("检查每个'%s = 0 (mod %d)'" % (C, n))
  97.     for a in range(1, maxa+1):
  98.         print("检查a = %d" % a)
  99.         C.set_variables_value(a=a)
  100.         v = C.eval()
  101.         if v % n != 0:
  102.             return False
  103.     print("步骤6 输出素数")
  104.     return True
  105. if __name__ == "__main__":
  106.     n = 31
  107.     print("检查'%d'是否为素数" % n)
  108.     result = is_prime_by_AKS(n)
  109.     if result is True:
  110.         print("YES")
  111.     else:
  112.         print("NO")
  113. else:
  114.     pass
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

  1. list = []
  2. prime_list = [2]

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

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

  11. for a in range(n):
  12.     list.append(sum(prime_list[a:a+4]))
  13.    
  14. print(list)
  15. 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 编辑
  1. def is_prime(n):
  2.   if n < 2:
  3.     return False
  4.   for i in range(2, int(n**0.5+1)):
  5.     if n%i == 0:
  6.       return False
  7.   return True

  8. def primesum(n):
  9.   x = 2
  10.   primelist = []
  11.   while (n + 3)!= 0:
  12.     if is_prime(x):
  13.       primelist.append(x)
  14.       n -= 1
  15.       x += 1
  16.     else:
  17.       x += 1     
  18.   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个求和
  1. def fun(n):
  2.     prime_nums, num = [2,3,5], 7
  3.     while len(prime_nums) < n + 3:
  4.         for i in range(2, int(num**0.5) +1):
  5.             if not num % i: break
  6.         else:
  7.             prime_nums.append(num)
  8.         num += 2 # 偶数不用考虑了
  9.     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,否则为素数,添加到列表中


  1. import math

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

  7.     while num < n:
  8.         for each in primes:
  9.             if temp % each == 0:
  10.                 is_prime = 0
  11.                 break
  12.         if is_prime:
  13.             primes.append(temp)
  14.             num += 1
  15.         else:
  16.             is_prime = 1
  17.         temp += 2

  18.     return primes

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

  22.     result = []

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

  25.     print(result)

  26. if __name__ == "__main__":
  27.     main()

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

使用道具 举报

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

使用道具 举报

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


  11. def getPrimeList(n):      # 求n+3个素数
  12.     primeList = []
  13.     number = 1
  14.     while len(primeList) < n + 3:
  15.         if isPrime(number):
  16.             primeList.append(number)
  17.         number += 1
  18.     return primeList

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


  21. print(getList(3))


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

使用道具 举报

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

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

  8. prime_count=[]
  9. prime=[]

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

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

  16. 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-4-20 13:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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