鱼C论坛

 找回密码
 立即注册
查看: 4964|回复: 47

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

[复制链接]
发表于 2018-9-11 11:00:42 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-9-12 19:45 编辑

我们的玩法做了一下改变:

1. 楼主不再提供答案。
2. 请大家先独立思考,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。开始阶段是看不到其他人的回帖的,等答题完成,开始评分时再取消限制。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
本题与206题类似,斐波那契数中有些数字是可以分别被其每一位数字整除的(忽略数字0),例如:
46368可以被3,4,6,8整除。
主要看大家的程序效率,比如能被6整数就不用考虑2和3了。
要求求出前10个这样的斐波那契数(不包括一位数1, 2, 3, 5, 8)。

游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
Hitdongfeng + 3 + 3 + 3

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-9-11 11:51:35 | 显示全部楼层
本帖最后由 凌九霄 于 2018-9-11 15:17 编辑
  1. import timeit

  2. P = '''
  3. def fibonacci(n):
  4.     if n > 0:
  5.         i, a, b = 0, 0, 1
  6.         while i < n:
  7.             a, b = b, a + b
  8.             i += 1
  9.         return a


  10. def fnum(n):
  11.     t = set(str(n)) - {'0', '1'}
  12.     if '6' in t:
  13.         t = t - {'2', '3'}
  14.     if '8' in t:
  15.         t = t - {'2', '4'}
  16.     return list(map(int, t))


  17. i, j = 7, 0

  18. while j < 10:
  19.     f = fibonacci(i)
  20.     t = fnum(f)
  21.     for k in t:
  22.         if f % k:
  23.             break
  24.         elif k == t[-1]:
  25.             print(f)
  26.             j += 1
  27.     i += 1
  28. '''
  29. print('运行用时:',timeit.timeit(stmt=P, number=1))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 13:35:56 | 显示全部楼层
本帖最后由 拉了盏灯 于 2018-9-12 00:00 编辑

  1. def feb(n):
  2.         a,b = 0,1
  3.         while b<n:
  4.                 a,b=b,a+b
  5.                 if b > 9:
  6.                         l=list(map(int,str(b)))
  7.                         if len(l)-l.count(0) == len([i for i in l if i != 0 and b%i ==0]):
  8.                                 yield b
  9.                
  10.                
  11. for i in feb(10**200):
  12.         print(i,'\n')
  13.                
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 13:36:57 | 显示全部楼层
本帖最后由 塔利班 于 2018-9-12 10:37 编辑

感觉找去因数的方法很蠢,回头再写- -
  1. def check(x):
  2.     p=sorted([x for x in set(map(int,str(x))) if x])
  3.     q=p[:]
  4.     l=len(p)
  5.     for i in range(l):
  6.         for j in range(i+1,l):
  7.             if q[j]%q[i]==0:
  8.                 try:
  9.                     p.remove(q[i])
  10.                 except:
  11.                     pass
  12.     for each in p:
  13.         if x%each:
  14.             return False
  15.     return True            
  16. def fib():
  17.     a,b=8,13
  18.     while True:
  19.         a,b=b,a+b
  20.         if check(a):
  21.             yield a
  22. a=fib()
  23. for i in range(10):
  24.     print(next(a))
复制代码



这个没筛,有时候感觉处理了也没提升运行速度,应该有更好的算法和内置吧
  1. from functools import reduce
  2. from math import gcd           
  3. a,b,c=8,13,0
  4. while c<10:
  5.     a,b=b,a+b
  6.     if not a%reduce(lambda x,y:x*y//gcd(x,y),[x for x in set(map(int,str(a))) if x],1):
  7.         c+=1
  8.         print(a)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 14:13:17 | 显示全部楼层
本帖最后由 graceasyi 于 2018-9-11 14:20 编辑
  1. def fib_itr(n):
  2.     if n < 0:
  3.         return None
  4.     if n <= 1:
  5.         return (0, 1)[n]
  6.     a, b = 0, 1
  7.     for i in range(n-1):
  8.         a, b = b, a+b
  9.     return b


  10. i = 7
  11. n = 0
  12. while n < 10:
  13.     fbi = fib_itr(i)
  14.     sm = set([int(d) for d in str(fbi)])
  15.     if 0 in sm: sm.remove(0)
  16.     if 1 in sm: sm.remove(1)
  17.     if 9 in sm:
  18.         if 3 in sm: sm.remove(3)
  19.     if 8 in sm:
  20.         if 2 in sm: sm.remove(2)
  21.         if 4 in sm: sm.remove(4)
  22.     if 6 in sm:
  23.         if 2 in sm: sm.remove(2)
  24.         if 3 in sm: sm.remove(3)
  25.     if 4 in sm:
  26.         if 2 in sm: sm.remove(2)

  27.     qt = [fbi % q for q in sm]
  28.     if qt.count(0) == len(qt):
  29.         print(fbi)
  30.         n += 1

  31.     i += 1
复制代码


结果:
55
144
46368
5358359254990966640871840
64202014863723094126901777428873111802307548623680
769246427201094785080787978422393713094534885688979999504447628313150135520
9216845717656874712980450562726202415567360565980794777111390850331644813674856981646960226192287360
110433070572952242346432246767718285942590237357555606380008891875277701705731473925618404421867819924194229142447517901959200
1323171012053243520828784042795469593341319770463238313551473338336502410952765153371119398122747569819754164672344667591018783803781288766524146031040
15853779289614481577191691577533518174485949824765525957623037737532160833631593681512535189759649213804709691705593604227037581022758330489263385511067756715301085561591382880

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 14:35:41 | 显示全部楼层
k
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-11 14:57:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-11 15:17:59 | 显示全部楼层
  1. def fib():
  2.     a,b = 0,1
  3.     while True:
  4.         a,b = b,a+b
  5.         yield a

  6. def my_filter(num):
  7.     each_num = []
  8.     org_num = num
  9.     while num:
  10.         temp = num%10
  11.         if temp not in each_num:
  12.             if temp != 0 and temp != 1:
  13.                 each_num.append(temp)
  14.         num //= 10
  15.         
  16.     #如果有9不考虑3;如果有8不考虑4和2;如果有6不考虑3和2;如果有4不考虑2。
  17.     if 9 in each_num:
  18.         if 3 in each_num:
  19.             each_num.remove(3)
  20.     if 8 in each_num:
  21.         if 4 in each_num:
  22.             each_num.remove(4)
  23.         if 2 in each_num:
  24.             each_num.remove(2)
  25.     if 6 in each_num:
  26.         if 3 in each_num:
  27.             each_num.remove(3)
  28.         if 2 in each_num:
  29.             each_num.remove(2)
  30.     if 4 in each_num:
  31.         if 2 in each_num:
  32.             each_num.remove(2)
  33.         
  34.     for each in each_num:
  35.         if org_num%each:
  36.             return False
  37.     return True


  38. def fun207():
  39.     count = 0
  40.     for each_fib in fib():
  41.         if each_fib > 10 and my_filter(each_fib):
  42.             print(each_fib)
  43.             count += 1
  44.         if count == 10:
  45.             break

  46. if __name__ == '__main__':
  47.     fun207()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 15:23:38 | 显示全部楼层
本帖最后由 骨傲天 于 2018-9-11 16:17 编辑
  1. def b():
  2.     a=1
  3.     b=0
  4.     while True:
  5.         yield a+b
  6.         a,b=a+b,a
  7. x=1
  8. for i in b():
  9.     if i<10:
  10.         continue
  11.     elif x<11:
  12.         r=list(map(int,str(i)))
  13.         re=[]
  14.         d,s=0,0
  15.         for y in r:
  16.             if y in re:
  17.                 continue
  18.             if y!=0 and i%y:
  19.                 break
  20.             elif y%2 and not s:
  21.                 re.extend([2,4,6,8])
  22.                 s=1
  23.             elif y%3 and not d:
  24.                 re.extend([3,9])
  25.                 d=1
  26.             else:
  27.                 re.append(y)
  28.         else:
  29.             print(i)
  30.             x+=1
  31.     else:
  32.         break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-11 15:51:50 | 显示全部楼层
本帖最后由 老猫NAKE 于 2018-9-11 15:54 编辑

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

使用道具 举报

发表于 2018-9-11 17:01:30 | 显示全部楼层
本帖最后由 天圆突破 于 2018-9-11 22:22 编辑
  1. class Feb:
  2.     def __init__(self):
  3.         self.a = self.b = 1

  4.     def __iter__(self):
  5.         return self

  6.     @staticmethod
  7.     def filter_num(n):
  8.         # 取集合,筛去0和1
  9.         lst = list(filter(lambda x:x!=0 and x!=1,set(map(lambda x:int(x), str(n)))))
  10.         # 倒序排序,早碰上早滚蛋,提高效率
  11.         lst.sort(reverse=True)
  12.         for each_n in lst:
  13.             if n%each_n != 0:
  14.                 return False
  15.         return True

  16.     def __next__(self):
  17.         while True:
  18.             self.a, self.b = self.b, self.a+self.b
  19.             if self.filter_num(self.a) and self.a > 10:
  20.                 return self.a

  21. if __name__ == '__main__':
  22.     for i in Feb():
  23.         input(i)
复制代码

我觉得考虑效率的话,去重去01外加逆排序就足够了
如果为了去掉2,3,4(只能去这3个数字),需要遍历4次才能去干净(从集合里找9864),不去的话只会多遍历3次(带着234去除).
所以还是不去了吧.

点评

大数的取模运算比去2,3,4要更费时  发表于 2018-9-12 20:49

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 19:16:17 | 显示全部楼层
本帖最后由 胡尔汉 于 2018-9-11 19:40 编辑

实在没有好的办法按照题目的方法优化效率,能不能给点建议或其他思路?
  1. def confirm_num(num):
  2.     l1 = [2,3,4,5,6,7,8,9]
  3.     num1 = str(num)
  4.     for i in num1:
  5.         i = int(i)
  6.         if i in l1:
  7.             if num%i != 0:
  8.                 return False
  9.             else:
  10.                 l1.remove(i)
  11.     return True
  12.             
  13. x,y,i = 5,8,0
  14. list1 = []  #存放符合要求的数字
  15. while i <10:
  16.     x,y = y,x+y
  17.     if confirm_num(y):
  18.         list1.append(y)
  19.         i+=1
  20.         
  21. print(list1)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 19:58:55 | 显示全部楼层
学习有限,目前也就仅到能做出来的程度了,后续改进
import copy
i = 1
n=0
num1 = 5
num2 = 8
while n < 10:
    num3 = num2 + num1
    #print ('num3=',num3) #斐波那契数
    x=copy.copy(num3) #
    s=len(str(x))
    h=0
    sum=0
    sz=[]
    while h<s:
        sz = sz + [x//(10**(s-h-1))]
        x=x-sz[h]*(10**(s-h-1))
        if sz[h] != 0:
            e = num3 % sz[h]
            sum+=e
        h+=1

    '''    h=h+1
    sz.sort()
    rz=sz
    m=0
    while m<len(rz)-1:
        if rz[m]==rz[m+1]:
            rz.remove(rz[m])
        else:
            m=m+1
    p=0
    while p<len(rz)-1:
     if rz[p] != 0:
        e = num3 % rz[p]
        sum+=e
        p+=1
    '''
    if sum==0:
        print (num3)
        n=n+1
        print('n=',n)
    i += 1
    num1 = num2
    num2 = num3

答案:
55
n= 1
144
n= 2
46368
n= 3
5358359254990966640871840
n= 4
64202014863723094126901777428873111802307548623680
n= 5
769246427201094785080787978422393713094534885688979999504447628313150135520
n= 6
9216845717656874712980450562726202415567360565980794777111390850331644813674856981646960226192287360
n= 7
110433070572952242346432246767718285942590237357555606380008891875277701705731473925618404421867819924194229142447517901959200
n= 8
1323171012053243520828784042795469593341319770463238313551473338336502410952765153371119398122747569819754164672344667591018783803781288766524146031040
n= 9
15853779289614481577191691577533518174485949824765525957623037737532160833631593681512535189759649213804709691705593604227037581022758330489263385511067756715301085561591382880
n= 10

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 20:13:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-11 20:45:58 | 显示全部楼层
  1. def feibonacci(num):
  2.     a,b = 0,1
  3.     count = 0
  4.     while count <num:
  5.         yield a
  6.         a,b = b,a+b
  7.         count +=1
  8.    

  9. def fun207(n):
  10.     result = list()
  11.     for i in feibonacci(5000):
  12.         if i in [0,1,2,3,5,8]:
  13.             pass
  14.         else:
  15.             for each in str(i):
  16.                 if int(each) == 0:
  17.                     pass
  18.                 elif i % int(each) == 0:
  19.                     a=True
  20.                 else:
  21.                     a=False
  22.                     break
  23.             if a:
  24.                 result.append(i)
  25.         if len(result)==n:
  26.             break
  27.     print(result)

  28. if __name__ == '__main__':
  29.     fun207(10)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 20:58:52 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-11 21:02:10 | 显示全部楼层
本帖最后由 谁与争锋 于 2018-9-11 21:26 编辑

list1 = []
list2 = [5,8]

while len(list1)<10:
    list2[-2],list2[-1]=list2[-1],list2[-1]+list2[-2]
    a=list2[-1]
    #print(a)
    num1=1
    b=str(a)
    c=list(b)
    c=list(set(c))
    c.sort(reverse=True)
    #print('c=',c)
    list3 = []
   
    if '0' in c:
        c.remove('0')
    while len(c)>0:
        d=int(c.pop(0))
        list3.append(d)
        if num1%d!=0:
            num1*=d
        list4 = c.copy()
        for e in list4:
            if d%(int(e))==0:
                c.remove(e)

    if a%num1==0:
        list1.append(a)
   
print(list1)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 21:34:42 | 显示全部楼层
本帖最后由 archlzy 于 2018-9-11 22:34 编辑
  1. def f207(n):
  2.     def creat_num(m):
  3.         a, b = 1, 0
  4.         for i in range(m):
  5.             a ,b = a+b ,a
  6.         return a
  7.         
  8.         
  9.     result = []
  10.     m = 0
  11.     while len(result) < n:
  12.         m += 1
  13.         temp = creat_num(m)
  14.         if temp >10:
  15.             temp_set = set([float(i) for i in list(set(str(temp))) if i not in  ["0","1"]])
  16.             temp_set -= set([j for i in temp_set for j in temp_set if i/j in temp_set])
  17.             temp_a = 0
  18.             for i in temp_set:
  19.                 temp_a += temp % int(i)
  20.             if temp_a == 0:
  21.                 result.append(temp)
  22.     return result

复制代码

没抢到 206的楼 好遗憾~

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 21:48:08 | 显示全部楼层
  1. def fun207(n):

  2.     def fib():
  3.         a, b = 0, 1
  4.         while 1:
  5.             a, b = b, a + b
  6.             yield a

  7.     g = fib()
  8.     flt = filter(lambda x: len(str(x)) > 1 and not sum(map(lambda y, x=x: x % y, {int(i) for i in str(x)} - {0, 1})), g)
  9.     return [next(flt) for _ in range(n)]

  10. print(fun207(10))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-9-11 22:01:46 | 显示全部楼层
hao
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 04:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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