鱼C论坛

 找回密码
 立即注册
查看: 9709|回复: 87

[技术交流] Python:每日一题 92(答题领鱼币)

[复制链接]
发表于 2017-9-5 20:54:28 | 显示全部楼层 |阅读模式

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

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

x
我们知道1,2,4,8,16,32,64和128这8个数字利用加法可以得到1~255中的任意数字,如
21 = 1 + 4 + 16
192 = 64 + 128
编写一个函数输入1~255的数字,给出如何用1,2,4,8,16,32,64和128 的加法可以到这个数字。
  1. def fun(num):
  2.     ........

  3. >>> print(fun(155))
  4. 1 + 2 + 8 + 16 + 128
  5. >>> print(fun(3))
  6. 1 + 2
  7. >>> print(fun(8))
  8. 8
复制代码


我的解法:

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

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-9-5 21:20:17 | 显示全部楼层
  1. def fun(num):
  2.     return "+".join(i for i,j in zip(['1','2','4','8','16','32','64','128'],bin(num)[-1:1:-1]) if int(j))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-5 21:24:56 | 显示全部楼层
  1. def fun(num):
  2.     mod = [128,64,32,8,4,2,1]
  3.     s = []
  4.     for i in mod:
  5.         if num >= i:
  6.             num = num - i
  7.             s.append(str(i))
  8.     s.reverse() # 128+64+8+4+1
  9.     return '+'.join(s)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-5 22:39:30 | 显示全部楼层
  1. def fun0(num):
  2.    list0 = []
  3.    for i in [128,64,32,16,8,4,2,1]:
  4.       if(num-i>=0):
  5.          list0.append(i)
  6.          num-=i
  7.    print('+'.join(str(i) for i in list0))
  8. N=int(input('请输入一个1-255之间的数字:'))
  9. fun0(N)
复制代码

=======
运行结果:
请输入一个1-255之间的数字:155
128+16+8+2+1

请输入一个1-255之间的数字:3
2+1

请输入一个1-255之间的数字:8
8

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-5 23:14:00 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-9-5 23:22 编辑

再来个递归写法
  1. fun = lambda n, exp='' : (exp+' + '+str(n)).strip(' + ') if n in [1,2,4,8,16,32,64,128] else [fun(n-i, exp+' + '+str(i)) for i in [128,64,32,16,8,4,2,1] if i<n][0]
  2. print(fun(15))
复制代码

8 + 4 + 2 + 1
[Finished in 0.1s]

不过这种一行输出的装X写法,当数字比较大时就会比较慢,分多行写就没这个问题。

多行写法:
  1. def fun(n, exp=''):
  2.         if n in [1,2,4,8,16,32,64,128]:
  3.                 return (exp+' + '+str(n)).strip(' + ')
  4.         else:
  5.                 for i in [128,64,32,16,8,4,2,1]:
  6.                         if i<n:
  7.                                 return fun(n-i, exp+' + '+str(i))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-5 23:51:09 | 显示全部楼层
把n转换成对应二进制数
  1. def fun(n):
  2.         if 1<=n<=255:
  3.                 b = str(bin(n))[2:]
  4.                 l = len(b)
  5.                 t = 1
  6.                 for i in range(l):
  7.                         if b[l-1-i] != '0':
  8.                                 if i != l-1:
  9.                                         print(str(t)+ ' + ',end='')
  10.                                 else:
  11.                                         print(str(t)+ ' = ',end='')
  12.                         t *= 2
  13.                 print(n)
  14.         else:
  15.                 print('请输入1~255的整数')
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 00:43:00 | 显示全部楼层
本帖最后由 Greenland 于 2017-9-6 00:50 编辑
  1. def fun(num):
  2.     if not isinstance(num, int) or num < 1:
  3.         print('请输入一个正整数')
  4.     renum = []
  5.     lnum = list(reversed(bin(num)))
  6.     base = 1
  7.     for i in lnum[:-2]:
  8.         if int(i):
  9.             renum.append(str(base))
  10.         base *= 2
  11.     return ' + '.join(renum)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 01:57:33 | 显示全部楼层
def fun():
    num = int(input('请输入一个1-255之间的数字:'))
    numbers = [1, 2, 4, 8, 16, 32, 64, 128]
    list_numbers = []
    for i in numbers:
        if (num - i) >= 0:
            list_numbers.append(str(i))
            num -= i
    print('+'.join(list_numbers), end='')

fun()

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 09:21:31 | 显示全部楼层
写出这行代码的时候,我听到cup在呼救……我一定会学好函数的
  1. print('神奇的8个数字:1,2,4,8,16,32,64,128')
  2. print('---------------------')
  3. number = int(input('请输入1-255之间的整数:'))
  4. for a in range(2):
  5.     for b in range(2):
  6.         for c in range(2):
  7.             for d in range(2):
  8.                 for e in range(2):
  9.                     for f in range(2):
  10.                         for g in range(2):
  11.                             if (a + 2*b + 4*c + 8*d + 16*e + 32*f + 128*g) == number:
  12.                                 print('%d + 2*%d + 4*%d + 8*%d + 16*%d + 32*%d + 128*%d' % (a,b,c,d,e,f,g))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 09:58:15 | 显示全部楼层
  1. def fun(mynum):
  2.     mystr=''
  3.     i=0
  4.     while(mynum!=0):
  5.         if mynum & 1:
  6.            mystr+=str(2**i)+'+'
  7.         mynum=mynum>>1
  8.         i+=1
  9.     return mystr[:-1]
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 09:59:36 | 显示全部楼层

想跟大神一样用很少的语句搞定需要看什么书
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 10:26:03 | 显示全部楼层
  1. def fun(n):
  2.     mod = [128,64,32,16,8,4,2,1]
  3.     num = []
  4.     for x in mod:
  5.         if n >= x:
  6.             n -= x
  7.             num.append(str(x))
  8.     num.sort(key=lambda x:int(x))
  9.     print(num)
  10.     return "+".join(num)
  11. fun(250)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 11:55:00 | 显示全部楼层
from random import choice
def fun(num):
    lis=[1,2,4,8,16,32,64,128,]
    a=choice(lis)
    b=choice(lis)
    c=choice(lis)
    d=choice(lis)
    e=choice(lis)
    f=choice(lis)
    g=choice(lis)
    h=choice(lis)
    while True:
        if a+b==num:
            print(str(a)+"+"+str(b)+"="+str(num))
            
        elif a+b+c==num:
            print(str(a)+"+"+str(b)+"+"+str(c)+"="+str(num))
        elif a+b+c+d==num:
            print(str(a)+"+"+str(b)+"+"+str(c)+"+"+str(d)+"="+str(num))
        elif a+b+c+d+e==num:
            print(str(a)+"+"+str(b)+"+"+str(c)+"+"+str(d)+"+"+str(e)+"="+str(num))
        elif a+b+c+d+e+f==num:
            print(str(a)+"+"+str(b)+"+"+str(c)+"+"+str(d)+"+"+str(e)+"+"+str(f)+"="+str(num))
            
        elif a+b+c+d+e+f+g==num:
            print(str(a)+"+"+str(b)+"+"+str(c)+"+"+str(d)+"+"+str(e)+"+"+str(f)+"+"+str(g)+"="+str(num))
        elif a+b+c+d+e+f+g+h==num:
            print(str(a)+"+"+str(b)+"+"+str(c)+"+"+str(d)+"+"+str(e)+"+"+str(f)+"+"+str(g)+"+"+str(h)+"="+str(num))

  
num=str(input("请输入数字:"))
fun(num)

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 12:33:44 | 显示全部楼层
let's me see see
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 13:12:53 | 显示全部楼层
def fun(n):
    str1=""
    list1=[128,64,32,16,8,4,2,1]
    for i in list1:
        if n-i>=0:
            n=n-i
            str1=str(i)+'+'+str1
            if n==0:  
                break
    return str1[:-1]

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 14:07:10 From FishC Mobile | 显示全部楼层
def fun(num):
    a=[128,64,32,16,8,4,2,1]
    b=""
    for i in a:
        if num >= i:
            num = num -i
            b=str(i)+" + "+b
        if num == 0:
            break
    print(b[:-3])
   
fun(128)   

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 16:41:18 | 显示全部楼层
写的很繁琐
def fun(num):
    x=[2**i for i in range(8)]
    y=[]
    t=-1
    while abs(t)!=len(x)+1:
        if num>=x[t]:
           y.append(x[t])
           num=num-x[t]
           t -= 1
        else:
           t -= 1

    return('+'.join(str(t) for t in y))
N=int(input('请输入一个255以内的整数:'))
print(N,'=',fun(N))

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 18:12:05 | 显示全部楼层
古堡主人。 发表于 2017-9-6 09:59
想跟大神一样用很少的语句搞定需要看什么书

几个版主才是大神,我还是入门水平
我还没看过相关的书··· ···
如果是我这个水平的话,你只要做多几次练习
看看别人的写法,过不了多久就差不多了
加油吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-6 20:35:02 | 显示全部楼层
def fun(num):
    buzhidao
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-7 10:53:09 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 00:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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