鱼C论坛

 找回密码
 立即注册
查看: 7727|回复: 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

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-15 21:48:01 | 显示全部楼层
看看答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-21 17:10:27 | 显示全部楼层
这个问题,我感觉从里面剔除2、3、4所占用的时间要多于判断2、3、4整除的时间(我还没有尝试,有以后试一下)。想加速,就把求斐波那契的过程省去,会快很多。
下面是我的程序:
  1. def mylist(num):
  2.         result=[]
  3.         while num:
  4.                 n=num%10
  5.                 if not n in result and n!=0 and n!=1:
  6.                         result.append(n)
  7.                 num=num//10
  8.         if 9 in result:
  9.                 if 3 in result:result.remove(3)
  10.         if 8 in result:
  11.                 if 4 in result:result.remove(4)
  12.                 if 2 in result:result.remove(2)
  13.         if 6 in result:
  14.                 if 3 in result:result.remove(3)
  15.                 if 2 in result:result.remove(2)
  16.         if 4 in result:
  17.                 if 2 in result:result.remove(2)
  18.         return result

  19. i,x1,x2=1,8,13
  20. while i<=10:
  21.         list1=mylist(x2)
  22.         for n in list1:
  23.                 if x2%n!=0:
  24.                         break
  25.         else:
  26.                 print('第%2d个数是%d' %(i,x2))
  27.                 i+=1
  28.         x1,x2=x2,x1+x2
复制代码

结果:
  1. 第 1个数是55
  2. 第 2个数是144
  3. 第 3个数是46368
  4. 第 4个数是5358359254990966640871840
  5. 第 5个数是64202014863723094126901777428873111802307548623680
  6. 第 6个数是769246427201094785080787978422393713094534885688979999504447628313150135520
  7. 第 7个数是9216845717656874712980450562726202415567360565980794777111390850331644813674856981646960226192287360
  8. 第 8个数是110433070572952242346432246767718285942590237357555606380008891875277701705731473925618404421867819924194229142447517901959200
  9. 第 9个数是1323171012053243520828784042795469593341319770463238313551473338336502410952765153371119398122747569819754164672344667591018783803781288766524146031040
  10. 第10个数是15853779289614481577191691577533518174485949824765525957623037737532160833631593681512535189759649213804709691705593604227037581022758330489263385511067756715301085561591382880
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 16:16:53 | 显示全部楼层
def fib(n):
    a=1
    b=1
    if n == 1:
        return 1
    elif n==2:
        return 1
    else:
        for i in range(2,n):
            c=a
            a=b
            b=c+b
        return b
   
def judge(x):
    set1=set()
    l=len(str(x))
    for i in range(0,l):
        set1.add(x//(10**(l-1)))
        set1.add(x%(10**i)//(10**(i-1)))
        set1.add(x%10)
    set1.discard(0)
    list1=list(set1)
    for each in list1:
        if x%each == 0:
            pass
        else:
            return 0
    return 1

   
i=7   
count=0
while 1:
    if judge(fib(i)):
        count+=1
        print(fib(i))
    i+=1
    if count==10:
        break
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-10 10:48:05 | 显示全部楼层
非常好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-9 14:52:08 | 显示全部楼层
666
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-23 07:46:04 | 显示全部楼层
小白前来学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-22 11:18:32 | 显示全部楼层
def fun207(n):

    def fib():
        a, b = 0, 1
        while 1:
            a, b = b, a + b
            yield a

    g = fib()
    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)
    return [next(flt) for _ in range(n)]

print(fun207(10))
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-13 10:08:48 | 显示全部楼层
  1. def func207(n, c):
  2.     #n表示需要输出的数字最小值屏蔽,屏蔽个位数,c表示需要多少个这样的数
  3.     tmp = []
  4.     for i in fab():
  5.         if n <= i:
  6.             tmplist=cushu(i)
  7.             if tmplist:
  8.                 for a in tmplist:
  9.                     if i % a != 0:
  10.                         break
  11.                 else:
  12.                     tmp.append(i)
  13.         if len(tmp) >= c:
  14.             return tmp

  15. def cushu(l):
  16.     tmplist = set()
  17.     for j in str(l):
  18.         if int(j) % 5 == 0:
  19.             tmplist.add(5)
  20.         if int(j) % 7 == 0:
  21.             tmplist.add(7)
  22.         if int(j) % 2 == 0:
  23.             tmplist.add(2)
  24.         if int(j) % 3 == 0:
  25.             tmplist.add(3)
  26.     if tmplist:
  27.         return tmplist
  28.     else:
  29.         return
  30. def fab():
  31.     n, a, b = 0, 0, 1
  32.     while 1:
  33.         yield b
  34.         a, b = b, a + b
  35.         n = n + 1
  36. import time
  37. start = time.time()
  38. print(func207(10, 10))
  39. print(time.time()-start)
复制代码

使用生成器的写法,yield的写法,不知道符不符合效率要求。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-12 21:08:11 | 显示全部楼层
塔利班 发表于 2018-9-12 20:30
万一这个数恰好就是0,1组成的呢

有道理,虽然没有碰到这样的数,但也应该考虑到。我在出题时没有想周全。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 20:36:09 | 显示全部楼层
  1. def fun207(temp):
  2.     tempS = temp
  3.     while tempS:
  4.         num = tempS%10
  5.         tempS //= 10
  6.         if num == 0:
  7.             continue
  8.         elif temp%num == 0:
  9.             continue
  10.         else:
  11.             return 0
  12.             break
  13.     return 1
  14.             
  15. def fab(numMax):
  16.     each,a,b = 0,8,13
  17.     flag = 0
  18.     while each<numMax:
  19.         temp = b
  20.         flag = fun207(temp)
  21.         if flag == 1:
  22.             yield b
  23.             a,b = b,a+b
  24.             each += 1
  25.         else:
  26.             a,b = b,a+b

  27. for each in fab(10):
  28.     print('-->',each)
  29.             
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 20:30:20 | 显示全部楼层
天圆突破 发表于 2018-9-11 17:01
我觉得考虑效率的话,去重去01外加逆排序就足够了
如果为了去掉2,3,4(只能去这3个数字),需要遍历4次才能 ...

万一这个数恰好就是0,1组成的呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 15:56:22 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-9-12 15:55:38 | 显示全部楼层
本帖最后由 ccqzhm 于 2018-9-12 17:04 编辑
  1. empty_set = set()
  2. repeat_dict = {9:{3}, 8:{4,2}, 7:empty_set, 6:{3, 2}, 5:empty_set, 4:{2}, 3:empty_set, 2:empty_set}
  3. def check(n):
  4.     if n < 10:
  5.         return False

  6.     number_set = set([int(x) for x in str(n) if x > '1'])

  7.     remov_set = set()
  8.     for x in number_set:
  9.         remov_set |= repeat_dict[x]
  10.     number_set -= remov_set

  11.     # print(n, str(number_set))
  12.     for x in number_set:
  13.         if n % x != 0:
  14.             return False
  15.     return True


  16. def fib():
  17.     a,b = 0,1
  18.     while True:
  19.         a, b = b, a + b
  20.         if check(b):
  21.             yield b

  22. def fun207():
  23.     f = fib()
  24.     for i in range(10):
  25.         print(next(f))

  26. fun207()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 15:53:58 | 显示全部楼层
  1. def fab():
  2.     a, b = 5, 8
  3.     while True:
  4.         a, b = b, a + b
  5.         yield b

  6. def main():
  7.     num = fab()
  8.     count = 0
  9.     while count < 10:
  10.         next_num = next(num)
  11.         next_num_list = list(set([int(i) for i in str(next_num)]))
  12.         if 1 in next_num_list:
  13.             next_num_list.remove(1)
  14.         if 0 in next_num_list:
  15.             next_num_list.remove(0)
  16.         primes = [2, 3, 5, 7]
  17.         next_num_list.sort(reverse=True)
  18.         new_next_num_list = next_num_list.copy()
  19.         for i in range(len(next_num_list)-1):
  20.             if next_num_list[i] in primes:
  21.                 continue
  22.             else:
  23.                 for j in range(i+1, len(next_num_list)):
  24.                     if next_num_list[i] % next_num_list[j] == 0 and next_num_list[j] in new_next_num_list:
  25.                         new_next_num_list.remove(next_num_list[j])
  26.         result_list = []
  27.         for each in new_next_num_list:
  28.             if next_num % each:
  29.                 result_list.append(False)
  30.             else:
  31.                 result_list.append(True)
  32.         if False not in result_list:
  33.             print(next_num)
  34.             count += 1




  35. if __name__ == '__main__':
  36.     main()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 14:44:07 | 显示全部楼层
本帖最后由 raphael213 于 2018-9-12 16:06 编辑

a, b, i = 0, 1, 0
list = []
while(i < 10):
    a, b = b, a+b
    str_a = str(a)
    str_a1 = ""
    n = 0
    if a >10:
#去重,和0
        for x in str_a:
            if int(x) != 0:
                if x not in str_a1:
                    str_a1 += x

        for each in str_a1:
            if a % int(each) == 0:
                n += 1
        if n == len(str_a1):
            list.append(a)
            i += 1

for i in range(len(list)):
    print(list[i])
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 14:00:27 | 显示全部楼层
昨天的今天可以给看答案了吧!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 13:47:38 | 显示全部楼层
本帖最后由 FC的注册很坑 于 2018-9-12 14:36 编辑
  1. #再来个超长版本
  2. def fib(n):
  3.     a=0
  4.     b=1
  5.     for i in range(n):
  6.         a,b=b,a+b
  7.     return b

  8. def fun207(n):
  9.     st=str(n)
  10.     li=paixu(st)
  11.     a0=False
  12.     a1=False
  13.     a2=False
  14.     a3=False
  15.     a4=False
  16.     for i in li:
  17.         if i==0:
  18.             a0=True
  19.         if i==1:
  20.             a1=True
  21.         if i==4 or i==6 or i==8:
  22.             a2=True
  23.         if i==6 or i==9:
  24.             a3=True
  25.         if i==8:
  26.             a4=True
  27.     if a0==True:
  28.         li.remove(0)
  29.     if a1==True:
  30.         li.remove(1)
  31.     if a2==True:
  32.         try:
  33.             li.remove(2)
  34.         except:
  35.             pass
  36.     if a3==True:
  37.         try:
  38.             li.remove(3)
  39.         except:
  40.             pass
  41.     if a4==True:
  42.         try:
  43.             li.remove(4)
  44.         except:
  45.             pass
  46.     for i in li:
  47.         if n % i!=0:
  48.             return False
  49.     return True

  50. def paixu(st):  # 去重和由大到小排序
  51.     l=len(st)
  52.     a=[]
  53.     for i in range(l):
  54.         a.append(int(st[i]))
  55.     a=list(set(a))
  56.     a.sort()
  57.     a.reverse()
  58.     return a

  59. count=7
  60. total=1
  61. while total<=10:
  62.     a=fib(count)
  63.     count+=1
  64.     if fun207(a):
  65.         print(a)
  66.         total+=1
复制代码
先贴个初稿上来看看情况
  1. def fib(n):
  2.     a=0
  3.     b=1
  4.     for i in range(n):
  5.         a,b=b,a+b
  6.     return b

  7. def fun207(n):
  8.     st=str(n)
  9.     list=paixu(st)
  10.     for i in list:
  11.         if i!=0 and i!=1: # 不用除以0和1
  12.             if n % i!=0:
  13.                 return False
  14.     return True

  15. def paixu(st):
  16.     l=len(st)
  17.     a=[]
  18.     for i in range(l):
  19.         a.append(int(st[i]))
  20.     a=list(set(a))
  21.     a.sort()
  22.     a.reverse()
  23.     return a

  24. count=7
  25. total=1
  26. while total<=10:
  27.     a=fib(count)
  28.     count+=1
  29.     if fun207(a):
  30.         print(a,end=" ")
  31.         total+=1
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2018-9-12 11:59:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-12 11:59:32 | 显示全部楼层
  1. def a207(n):
  2.     a=5
  3.     b=8
  4.     while n:
  5.         c=a+b
  6.         s3=str(c)
  7.         if '0' in s3:
  8.             s3=s3.replace('0','')
  9.         if '1' in s3:
  10.             s3=s3.replace('1','')        
  11.         s2=list(set(([int(i) for i in s3])))
  12.         if 6 in s2:
  13.             try:
  14.                 s2.remove(3)
  15.                 s2.remove(2)
  16.             except ValueError:
  17.                 pass
  18.         if 8 in s2:
  19.             try:
  20.                 s2.remove(4)
  21.                 s2.remove(2)
  22.             except ValueError:
  23.                 pass
  24.         if 9 in s2:
  25.             try:
  26.                 s2.remove(3)
  27.             except ValueError:
  28.                 pass
  29.         if 4 in s2:
  30.             try:
  31.                 s2.remove(2)
  32.             except ValueError:
  33.                 pass
  34.         count=0
  35.         for i in s2:
  36.             if c%i:
  37.                 count+=1
  38.         if count==0:
  39.             print(c)
  40.             n-=1
  41.             a=b
  42.             b=c
  43.         else:
  44.             a=b
  45.             b=c
  46.             count=0
  47.         
  48. a207(10)
复制代码

评分

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

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-22 04:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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