鱼C论坛

 找回密码
 立即注册
查看: 3332|回复: 15

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

[复制链接]
发表于 2017-9-29 10:15:00 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2017-9-30 21:46 编辑

首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 为了让大家独立思考,跟帖改为“回帖仅作者可见”。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
我们知道数字2、3既是质数又属于斐波那契数列,要求求出1000以内所有既是质数又属于斐波那契数列的数字。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-9-29 12:28:52 | 显示全部楼层
  1. import math

  2. def fun(num):
  3.     if num == 1 :
  4.         return 1
  5.     elif num == 2:
  6.         return 1
  7.     else:
  8.         return fun(num-1) + fun(num - 2)

  9. fun_num = []
  10. n = 1
  11. while True:
  12.     prime = True
  13.     # 获得斐波那契数
  14.     totle = fun(n)
  15.    
  16.     if totle >= 1000:
  17.         break
  18.     else:
  19.         if totle != 1:
  20.             # 判断斐波那契数是不是质数
  21.             num =math.floor(math.sqrt(totle))
  22.             for j in range(2,num+1):
  23.                 if totle % j == 0 :
  24.                     prime = False
  25.                     break
  26.             if prime:
  27.                 fun_num.append(totle)
  28.     n += 1
  29. print(fun_num)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-29 13:15:29 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-9-29 13:58 编辑

根据Sixpy大大的建议改进:
  1. f1,f2=1,2
  2. while f2<1000:
  3.         is_prime = lambda n: True if n in {2,3,5,7,11,13,17,19,23,29,31,37} else all(False for p in {2,3,5,7,11,13,17,19,23,29} if pow(p,n-1,n) != 1)
  4.         if is_prime(f2): print(f2, end=' ')
  5.         f1,f2 = f2,f1+f2
复制代码

2 3 5 13 89 233

点评

in {2,3,5,7,11,13,17,19,23,29} 改成集合,O(1), 元组是O(n)  发表于 2017-9-29 13:48

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-29 21:07:50 | 显示全部楼层
  1. def fun(n):
  2.     a, b = 2, 3
  3.     while b < n:
  4.         if is_prime(a):
  5.             yield a
  6.         a, b = b, a+b

  7. def is_prime(n):
  8.     for i in range(2,n):
  9.         if n % i == 0:
  10.             return False
  11.     return True

  12. for i in fun(1000):
  13.     print(i)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-29 21:20:28 | 显示全部楼层
取n以内质数集合,与100项以内斐波那契集合取交集
第100项斐波那契已经有10的20次方了,基本保证 >n
  1. def fun(n):
  2.     prime = {i for i in range(2,n+1) if 0 not in (i%j for j in range(2,int(i**0.5)+1))}
  3.     fib = {k[0] for k in [(a[-1],a.append(a[-1]+a[-2])) for a in ([1,1],) for j in range(100)]}
  4.     return prime & fib
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-30 08:35:37 | 显示全部楼层
感觉自己的代码写的可丑……
  1. #求出斐波拉契数列
  2. m = 0
  3. n = 1
  4. total = 1
  5. list1 = []
  6. while True:
  7.     total = m + n
  8.     if total < 1000:
  9.         list1.append(total)
  10.         m = n
  11.         n = total
  12.     else:
  13.         break

  14. #求出质数
  15. list2 = [2]
  16. for each in list1:
  17.     t = 0
  18.     each = int(each)

  19.     for i in range(2,each):
  20.         if (each % i) != 0:
  21.             t = 1
  22.         else:
  23.             t = 0
  24.             break
  25.     if t != 0:
  26.         list2.append(each)
  27.             
  28. print(list2)
复制代码

输入结果:[2, 3, 5, 13, 89, 233]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-30 09:03:25 | 显示全部楼层
递归写法
  1. #求出斐波拉契数列
  2. def fun(n):

  3.     if n <= 1 :
  4.         return n
  5.     else:
  6.         result = int(fun(n-1))+ int(fun(n-2))
  7.         return  result
  8. list1 = []
  9. for i in range(17):
  10.     list1.append(fun(i))


  11. #求出质数
  12. list2 = [2]
  13. for each in list1:
  14.     t = 0
  15.     each = int(each)

  16.     for i in range(2,each//2 + 2):
  17.         if (each % i) != 0:
  18.             t = 1
  19.         else:
  20.             t = 0
  21.             break
  22.     if t != 0:
  23.         list2.append(each)
  24.             
  25. print(list2)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-10-6 22:05:20 | 显示全部楼层
  1. import math

  2. def double_check(x):   
  3.     def fibonacci(n):
  4.         if n == 0:
  5.             return 0
  6.         if n == 1:
  7.             return 1
  8.         return fibonacci(n-1) + fibonacci(n-2)
  9.     def prime_check(y):
  10.         list_a = [j for j in range(2,int(math.sqrt(y)))]
  11.         list_prime = []
  12.         for m in list_a:
  13.             for k in range(2,m):
  14.                 if m%k == 0 and k != 1:
  15.                     break
  16.             else:
  17.                 list_prime.append(m)
  18.         for l in list_prime:
  19.             if y%l == 0:
  20.                 return False
  21.         return True
  22.     n = 3
  23.     result_list = []
  24.     while fibonacci(n) <= x:
  25.         if prime_check(fibonacci(n)):
  26.             result_list.append(fibonacci(n))
  27.         n += 1
  28.     return result_list

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

使用道具 举报

发表于 2017-10-6 23:03:47 | 显示全部楼层
  1. def isprime(n):
  2.     if n == 1:
  3.         return False
  4.     if n == 2 :
  5.         return True

  6.     for i in range(2,n//2 + 1):
  7.         if n % i == 0:
  8.             return False

  9.     return True

  10. def fab():
  11.     n1, n2 = 1, 1

  12.     while True:
  13.         n1, n2 = n2,n1+n2
  14.         yield n1

  15. a = fab()
  16. while True:
  17.     b = next(a)
  18.     if b <= 1000 and isprime(b):
  19.         print(b)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-14 16:44:03 | 显示全部楼层
x=1
y=1
z=1
m=0
q=[]
while m<=20:
    z=x+y
    x=y
    y=z
    q.append(z)
    m+=1


p=[]
for a in range(2,101):
    if a==2:
        p.append(a)
    else:
        if 0 not in [a%b for b in range(2,a)]:
            p.append(a)
for h in q:
    if h in p:
        print(h)
      
     
     
            
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-28 00:02:35 | 显示全部楼层
solomonxian 发表于 2017-9-29 21:20
取n以内质数集合,与100项以内斐波那契集合取交集
第100项斐波那契已经有10的20次方了,基本保证 >n

怎么您对python的语法,各种库函数这么熟悉啊,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-14 17:13:16 | 显示全部楼层
  1. list1 = []

  2. def addNum(num) :
  3.         if num in [0, 1] :
  4.                 return 1
  5.         else :
  6.                 return addNum(num - 1) + addNum(num - 2)

  7. def getNum() :
  8.         global  list1
  9.         for i in range(20) :
  10.                 if addNum(i) <= 1000 :
  11.                         list1.append(addNum(i))
  12.                 else :
  13.                         break
  14.         print(list1)

  15. def getPrime() :
  16.         getNum()
  17.         global list1
  18.         list2 = []
  19.         for i in list1 :
  20.                 flag = 0
  21.                 for j in range(2, i // 2 + 1) :
  22.                         if i == 1 :
  23.                                 continue
  24.                         if i % j == 0 :
  25.                                 flag += 1
  26.                 if flag == 0 :
  27.                         list2.append(i)
  28.         for i in list2[:] :
  29.                 if i == 1 :
  30.                         list2.remove(i)
  31.         print(list2)

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

使用道具 举报

发表于 2019-2-15 14:30:59 | 显示全部楼层
  1. def fib(num) :
  2.         if num in [1, 2] :
  3.                 return 1
  4.         else :
  5.                 return fib(num - 1) + fib(num - 2)


  6. def isPrime(num) :
  7.         flag = 0
  8.         for i in range(2, num // 2) :
  9.                 if num % i == 0 :
  10.                         flag += 1
  11.         if flag > 0 :
  12.                 return False
  13.         else :
  14.                 return True


  15. def getNum() :
  16.         list1 = []
  17.         for i in range(1, 20) :
  18.                 if fib(i) >= 1000 :
  19.                         break
  20.                 else :
  21.                         list1.append(fib(i))
  22.         for i in list1[:] :
  23.                 if (i == 1) or (not isPrime(i)) :
  24.                         list1.remove(i)
  25.         print(list1)

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

使用道具 举报

发表于 2019-3-12 10:55:05 | 显示全部楼层
  1. def fun106():
  2.     a = 1
  3.     b = 1
  4.     list1 = []
  5.     while b < 1000:
  6.         a, b = b, a+b
  7.         prime = True
  8.         if b > 3:
  9.             for i in range(2,b):
  10.                 #排除非质数
  11.                 if b%i == 0:
  12.                     prime = False
  13.                     break
  14.         if prime:
  15.             list1.append(b)

  16.     return list1[:-1]

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

使用道具 举报

发表于 2020-5-6 19:18:59 | 显示全部楼层
  1. #判断费那波切数:
  2. def fei():
  3.     s=[1,]
  4.     a=1
  5.     b=1
  6.     for i in range(1000):
  7.         a,b=b,a+b
  8.         if a>=1000:
  9.             break
  10.         s.append(a)
  11.     return s
  12. #判断是否为质数
  13. def zhi():
  14.     z=[]
  15.     for i in range(2,1000):
  16.         for j in range(2,i):
  17.             if i%j==0:
  18.                 break
  19.         else:
  20.             z.append(i)
  21.     return z
  22. a=zhi()
  23. b=fei()
  24. for i in a:
  25.     for j in b:
  26.         if i==j:
  27.             print(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-17 04:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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