鱼C论坛

 找回密码
 立即注册
查看: 10838|回复: 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 的加法可以到这个数字。
def fun(num):
    ........

>>> print(fun(155))
1 + 2 + 8 + 16 + 128
>>> print(fun(3))
1 + 2
>>> print(fun(8))
8

我的解法:

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

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-9-5 21:20:17 | 显示全部楼层
def fun(num):
    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 | 显示全部楼层
def fun(num):
    mod = [128,64,32,8,4,2,1]
    s = []
    for i in mod:
        if num >= i:
            num = num - i
            s.append(str(i))
    s.reverse() # 128+64+8+4+1 
    return '+'.join(s)

评分

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

查看全部评分

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

使用道具 举报

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

再来个递归写法
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]
print(fun(15))
8 + 4 + 2 + 1
[Finished in 0.1s]

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

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

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-9-6 00:43:00 | 显示全部楼层
本帖最后由 Greenland 于 2017-9-6 00:50 编辑
def fun(num):
    if not isinstance(num, int) or num < 1:
        print('请输入一个正整数')
    renum = []
    lnum = list(reversed(bin(num)))
    base = 1
    for i in lnum[:-2]:
        if int(i):
            renum.append(str(base))
        base *= 2
    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在呼救……我一定会学好函数的
print('神奇的8个数字:1,2,4,8,16,32,64,128')
print('---------------------')
number = int(input('请输入1-255之间的整数:'))
for a in range(2):
    for b in range(2):
        for c in range(2):
            for d in range(2):
                for e in range(2):
                    for f in range(2):
                        for g in range(2):
                            if (a + 2*b + 4*c + 8*d + 16*e + 32*f + 128*g) == number:
                                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 | 显示全部楼层
def fun(mynum):
    mystr=''
    i=0
    while(mynum!=0):
        if mynum & 1:
           mystr+=str(2**i)+'+'
        mynum=mynum>>1
        i+=1
    return mystr[:-1]

评分

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

查看全部评分

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

使用道具 举报

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

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

使用道具 举报

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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