鱼C论坛

 找回密码
 立即注册
查看: 3722|回复: 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 | 显示全部楼层
import math

def fun(num):
    if num == 1 :
        return 1
    elif num == 2:
        return 1
    else:
        return fun(num-1) + fun(num - 2)

fun_num = []
n = 1
while True:
    prime = True
    # 获得斐波那契数
    totle = fun(n)
    
    if totle >= 1000:
        break
    else:
        if totle != 1:
            # 判断斐波那契数是不是质数
            num =math.floor(math.sqrt(totle))
            for j in range(2,num+1):
                if totle % j == 0 :
                    prime = False
                    break
            if prime:
                fun_num.append(totle)
    n += 1
print(fun_num)

评分

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

查看全部评分

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

使用道具 举报

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

根据Sixpy大大的建议改进:
f1,f2=1,2
while f2<1000:
        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)
        if is_prime(f2): print(f2, end=' ')
        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 | 显示全部楼层
def fun(n):
    a, b = 2, 3
    while b < n:
        if is_prime(a):
            yield a
        a, b = b, a+b

def is_prime(n):
    for i in range(2,n):
        if n % i == 0:
            return False
    return True

for i in fun(1000):
    print(i)

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

#求出质数
list2 = [2]
for each in list1:
    t = 0
    each = int(each)

    for i in range(2,each):
        if (each % i) != 0:
            t = 1
        else:
            t = 0
            break
    if t != 0:
        list2.append(each)
            
print(list2)
输入结果:[2, 3, 5, 13, 89, 233]

评分

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

查看全部评分

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

使用道具 举报

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

    if n <= 1 :
        return n
    else:
        result = int(fun(n-1))+ int(fun(n-2))
        return  result
list1 = []
for i in range(17):
    list1.append(fun(i))


#求出质数
list2 = [2]
for each in list1:
    t = 0
    each = int(each)

    for i in range(2,each//2 + 2):
        if (each % i) != 0:
            t = 1
        else:
            t = 0
            break
    if t != 0:
        list2.append(each)
            
print(list2)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

def double_check(x):    
    def fibonacci(n):
        if n == 0:
            return 0
        if n == 1:
            return 1
        return fibonacci(n-1) + fibonacci(n-2)
    def prime_check(y):
        list_a = [j for j in range(2,int(math.sqrt(y)))]
        list_prime = []
        for m in list_a:
            for k in range(2,m):
                if m%k == 0 and k != 1:
                    break
            else:
                list_prime.append(m)
        for l in list_prime:
            if y%l == 0:
                return False
        return True
    n = 3
    result_list = []
    while fibonacci(n) <= x:
        if prime_check(fibonacci(n)):
            result_list.append(fibonacci(n))
        n += 1
    return result_list

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

使用道具 举报

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

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

    return True

def fab():
    n1, n2 = 1, 1

    while True:
        n1, n2 = n2,n1+n2
        yield n1

a = fab()
while True:
    b = next(a)
    if b <= 1000 and isprime(b):
        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 | 显示全部楼层
list1 = []

def addNum(num) :
        if num in [0, 1] :
                return 1
        else :
                return addNum(num - 1) + addNum(num - 2)

def getNum() :
        global  list1
        for i in range(20) :
                if addNum(i) <= 1000 :
                        list1.append(addNum(i))
                else :
                        break
        print(list1)

def getPrime() :
        getNum()
        global list1
        list2 = []
        for i in list1 :
                flag = 0
                for j in range(2, i // 2 + 1) :
                        if i == 1 :
                                continue
                        if i % j == 0 :
                                flag += 1
                if flag == 0 :
                        list2.append(i)
        for i in list2[:] :
                if i == 1 :
                        list2.remove(i)
        print(list2)

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

使用道具 举报

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


def isPrime(num) :
        flag = 0
        for i in range(2, num // 2) :
                if num % i == 0 :
                        flag += 1
        if flag > 0 :
                return False
        else :
                return True


def getNum() :
        list1 = []
        for i in range(1, 20) :
                if fib(i) >= 1000 :
                        break
                else :
                        list1.append(fib(i))
        for i in list1[:] :
                if (i == 1) or (not isPrime(i)) :
                        list1.remove(i)
        print(list1)

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

使用道具 举报

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

    return list1[:-1]

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

使用道具 举报

发表于 2020-5-6 19:18:59 | 显示全部楼层
#判断费那波切数:
def fei():
    s=[1,]
    a=1
    b=1
    for i in range(1000):
        a,b=b,a+b
        if a>=1000:
            break
        s.append(a)
    return s
#判断是否为质数
def zhi():
    z=[]
    for i in range(2,1000):
        for j in range(2,i):
            if i%j==0:
                break
        else:
            z.append(i)
    return z
a=zhi()
b=fei()
for i in a:
    for j in b:
        if i==j:
            print(i)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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