鱼C论坛

 找回密码
 立即注册
查看: 7296|回复: 74

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

[复制链接]
发表于 2018-2-23 10:29:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 冬雪雪冬 于 2018-2-25 21:39 编辑

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

1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目:
上一题很简单,这回来个稍微难点的。
6174是个神奇的数字,一个任意的四位正整数(全相同的除外,如1111)。将数字重新组合成一个最大的数和最小的数相减,重复这个过程,最多七步,必得6174。
现在编程验证此现象,输入一个每位数不完全相同的四位正整数,给出计算过程,最终得到6174,例如:
输入2687
打印
8762-2678=6084
8640-468=8172
8721-1278=7443
7443-3447=3996
9963-3699=6264
6642-2466=4176
7641-1467=6174

注意如果数字是7767则
7776-6777=999
9990-999=8991
这里是9990-999,而不是999-999,即第一个数如果不是4位要在后面补0到四位。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2018-2-23 11:23:17 | 显示全部楼层
6174这么神奇吗?学习了!!!
  1. def magic_num(num):
  2.         global step
  3.         if num == 6174:
  4.                 return '完成任务!'
  5.                
  6.         else:
  7.                 list1_num = list(str(num))
  8.                 list2_num = []
  9.                 list3_num = []
  10.                 str2_num = ''
  11.                 str3_num = ''
  12.                
  13.                 list1_num.sort(reverse = True)
  14.                 for each in list1_num:
  15.                         str2_num += each
  16.                 num2 = int(str2_num)
  17.                
  18.                 list1_num.sort()
  19.                 for each in list1_num:
  20.                         str3_num += each
  21.                 num3 = int(str3_num)
  22.                
  23.                 result = num2 - num3
  24.                
  25.                 print('#',step,'#',num2,'-',num3,'=',result)
  26.                 step += 1
  27.                 while result < 1000:
  28.                         result *= 10
  29.                 return magic_num(result)
  30.        
  31. x = input('请输入不相同的4位整数:')
  32. step = 0
  33. magic_num(x)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 11:29:03 | 显示全部楼层
  1. def check6174():
  2.     number = input('输入一个每位数不完全相同的四位正整数:')
  3.     if number.isnumeric() and number[0] != '0' and len(set(number)) != 1:
  4.         while True:
  5.             maxN = int(''.join(sorted(number)[::-1]))
  6.             minN = int(''.join(sorted(number)))
  7.             number = str(maxN - minN)
  8.             print(maxN, '-', minN, '=', number)
  9.             if number == '6174':
  10.                 break
  11.             length = len(number)
  12.             if length < 4:
  13.                 number += '0'*(4-length)
  14.             
  15.     else:
  16.         print('不是正确的四位数。')

  17. while True:
  18.     check6174()
  19.     a = input('Q退出,任意键继续:')
  20.     if a in ('q', 'Q'):
  21.         break
复制代码
1.png

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 12:34:51 | 显示全部楼层
本帖最后由 °蓝鲤歌蓝 于 2018-2-23 16:54 编辑
  1. while True:
  2.     each = int(input('输入数字:'))
  3.     while each != 6174:
  4.         small = int(''.join(sorted(str(each))))
  5.         large = int(''.join(list(reversed(sorted(str(each))))))
  6.         if large < 1000:
  7.             large *= 10
  8.         each = large - small
  9.         print('%d-%d=%d'%(large, small, each))
复制代码


我觉得如果输入的数是6174本身的话就不用输出计算步骤了。

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 12:37:07 | 显示全部楼层
  1. str1=input('请输入三位或四位数:')

  2. def getshu(str1):
  3.     list1=[]
  4.     if len(str1)==3:
  5.         str1=str1+'0'
  6.         for i in str1:
  7.             list1.append(int(i))
  8.         list1=sorted(list1)
  9.         list2=list(reversed(list1))
  10.         mins=list1.pop()+list1.pop()*10+list1.pop()*100+list1.pop()*1000
  11.         mans=list2.pop()+list2.pop()*10+list2.pop()*100+list2.pop()*1000
  12.         print('%d-%d=%d'%(mans,mins,mans-mins))
  13.         if mans-mins!=6174:
  14.             getshu(str(mans-mins))
  15.         else:
  16.             return 6174
  17.     else:
  18.         for i in str1:
  19.             list1.append(int(i))
  20.         list1=sorted(list1)
  21.         list2=list(reversed(list1))
  22.         mins=list1.pop()+list1.pop()*10+list1.pop()*100+list1.pop()*1000
  23.         mans=list2.pop()+list2.pop()*10+list2.pop()*100+list2.pop()*1000
  24.         print('%d-%d=%d'%(mans,mins,mans-mins))
  25.         if mans-mins!=6174:
  26.             getshu(str(mans-mins))
  27.         else:
  28.             return 6174
  29. getshu(str1)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 14:52:42 | 显示全部楼层
Untitled.png

magic6174.zip

407.42 KB, 下载次数: 29

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 15:06:11 | 显示全部楼层
i=eval(input("输入任一各位数非全相同的四位数"))
m=i
a=0
count=0
while a!=6174:
    if count>=1:
        i=a
    b=i//1000
    c=(i-b*1000)//100
    d=(i-b*1000-c*100)//10
    e=i%10
    if c>b:
        b,c=c,b
    if d>b:
        b,d=d,b
    if e>b:
        b,e=e,b
    if d>c:
        c,d=d,c
    if e>c:
        c,e=e,c
    if e>d:
        d,e=e,d
    ma=b*1000+c*100+d*10+e
    mi=e*1000+d*100+c*10+b
    a=ma-mi
    if a>=100 and a<1000:
        a=a*10
    if a>=10 and a<100:
        a=a*100
    if a<10:
        a=a*1000
    count=count+1
print("在计算%d次后%d变为6174"%(count,m))

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 15:07:30 | 显示全部楼层
本帖最后由 wlb666 于 2018-2-23 15:25 编辑
  1. i=input("请输入一个数")
  2. while int(i)!=6174:
  3.         a=list(i)
  4.         b=[int(a[n]) for n in range(0,len(a))]
  5.         c=b
  6.         b.sort()
  7.         b=[str(b[n]) for n in range(0,len(b))]
  8.         num1="".join(b)
  9.         c.reverse()
  10.         c=[str(c[n]) for n in range(0,len(c))]
  11.         num2="".join(c)
  12.         num1=int(num1)
  13.         num2=int(num2)
  14.         if num2==num1:
  15.                 num2=int(str(num2)+"0")
  16.         if len(str(num2))!=4:
  17.                 num1=int(str(num1)+"0")
  18.         num3=num2-num1
  19.         print(str(num2)+"-"+str(num1)+"="+str(num3))
  20.         i=str(num3)


  21.        



复制代码

4.png
5.png

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 15:08:02 | 显示全部楼层
wlb666 发表于 2018-2-23 15:07
结果:请输入一个数4856
8654-4568=4086
8640-468=8172

不过我的map函数怎么老是出错??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-23 15:45:30 | 显示全部楼层
  1. def fun(n):

  2.     while n != 6174:
  3.         a = int(''.join( sorted(str(n), reverse = True) ))
  4.         b = int(''.join( sorted(str(n)) ))
  5.         
  6.         if a < 1000:
  7.             a = a * 10
  8.             
  9.         n = a - b
  10.         print('{} - {} = {}'.format(a, b, n))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 16:11:21 | 显示全部楼层
  1. def f(n):
  2.     N = str(n) if len(str(n)) == 4 else str(n)+'0'
  3.     while N != '6174':
  4.         big = int(''.join(sorted(N, reverse = True)))
  5.         small = int(''.join(sorted(N)))
  6.         print('%d-%d=%d' % (big, small, big - small))
  7.         N = str(big - small)

  8. f(2687)
复制代码

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
冬雪雪冬 + 1 + 1 7767时出错

查看全部评分

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

使用道具 举报

发表于 2018-2-23 16:22:52 | 显示全部楼层
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-

  3. # 找到最大的一个四位数字
  4. def find_max(num):
  5.     ori_list = list(str(num))
  6.     for i in range(len(ori_list)):
  7.         for j in range(i+1, len(ori_list)):
  8.             if int(ori_list[i]) < int(ori_list[j]):
  9.                 tmp = ori_list[i]
  10.                 ori_list[i] = ori_list[j]
  11.                 ori_list[j] = tmp

  12.     return int(''.join(ori_list))

  13. # 根据最大的四位数,找到最小的四位数字
  14. def find_min(num):
  15.     new_list = list(str(num))
  16.     new_list.reverse()

  17.     return int(''.join(new_list))

  18. # 针对小于四位数字的结果,进行补零操作
  19. def zeroize(num):
  20.     if num < 1000:
  21.         return num * 10
  22.     else:
  23.         return num

  24. # 打印出每一次的计算结果
  25. def print_calc(num):
  26.     if num == 6174:
  27.         return
  28.     else:
  29.         max_one = find_max(num)
  30.         min_one = find_min(max_one)

  31.         res = max_one - min_one
  32.         print('%d - %d = %d' %(max_one, min_one, res))
  33.         print_calc(zeroize(res))


  34. # 主方法
  35. def main():
  36.     num = input('请输入任意一个四位数字(不可以完全相同):')
  37.     while not num.isdigit() or len(str(num)) != 4:
  38.         num = input('请输入任意一个四位数字(不可以完全相同):')

  39.     print_calc(num)


  40. if __name__ == '__main__':
  41.     main()
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 16:27:34 | 显示全部楼层
本帖最后由 凌九霄 于 2018-2-23 16:58 编辑
  1. def checkcalc(stringnum):
  2.     stringlist = list(stringnum)    #将字符串转化为列表
  3.     stringlist.sort()               #获得最小值排序
  4.     minnum = ''.join(stringlist)    #重新连接为字符串
  5.     maxnum = minnum[::-1]           #字符串反转得到最大值

  6.     return (maxnum + ' ' + minnum).split(' ')

  7. string = str(input("请输入不全相同的4位整数:"))
  8. valuelist = checkcalc(string)
  9. value = int(valuelist[0]) - int(valuelist[1])
  10. while (value != 6174):
  11.     num = str(value).ljust(4,'0')
  12.     print("{0} - {1} = {2}".format(int(valuelist[0]),int(valuelist[1]),value))
  13.     valuelist = checkcalc(num)
  14.     value = int(valuelist[0]) - int(valuelist[1])

  15. print("{0} - {1} = {2}".format(int(valuelist[0]),int(valuelist[1]),value))
复制代码


360截图20180223165225871.jpg 360截图20180223162907366.jpg

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 16:38:15 | 显示全部楼层
num =input()
while num != 6174:
    str1 = ''
    str2 = ''
    for i in sorted(str(num), reverse = True):
        if i != '0':
            str1 += i
    while len(str1) < 4:
        str1+='0'
    for j in sorted(str(num)):
            if j != '0':
                str2 +=j
    num=int(str1)-int(str2)
    print(str1+'-'+str2+'=', num)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 16:45:41 | 显示全部楼层
from builtins import int, str

num = input('请输入一个四位且不完全重复正整数:')
flag = True
while(flag):
    if(num.isdigit() and len(num)==4 and max(num)!=min(num)):
        flag = False
        break
    else:
        num = input('格式错误,请重新输入一个四位且不完全重复正整数:')
def getShort(num):
    minNum =int(''.join(sorted(num)))
    maxNum = int(''.join(sorted(num,reverse=True)))
    result = maxNum-minNum
    print('%d-%d=%d'%(maxNum,minNum,result))
    return result
def getShort1(num):
    minNum =int(''.join(sorted(num)))
    maxNum = int(''.join(sorted(num,reverse=True)))
    result = maxNum-minNum
    return result
result =  getShort(num)
if(result == 6174):
    print('验证完毕')
else:
    result = str(result)
    while(len(result)!=4):
        result = result +'0'
    while(getShort(result)!=6174):
        result = str(getShort1(result))
        


请输入一个四位且不完全重复正整数:7767
7776-6777=999
9990-999=8991
9981-1899=8082
8820-288=8532
8532-2358=6174

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 17:14:49 | 显示全部楼层
#Magic 6147

def sort(x):
    num1 = []
    for s in str(x):
        num1.append(int(s))
    while len(num1)<4:
        num1.append(0)
    num2 = []
    for i in range(4):
        temp = max(num1)
        num2.append(temp)
        num1.remove(temp)
    return num2[0]*1000+num2[1]*100+num2[2]*10+num2[3],num2[0]+num2[1]*10+num2[2]*100+num2[3]*1000

#x=3
#print(sort(x))

def main():
    x = int(input("6174是个神奇的数字,一个任意的四位正整数(全相同的除外,如1111)。将数字重新组合成一个最大的数和最小的数相减,重复这个过程,最多七步,必得6174。\n"))
    while x != 6174:
        temp = sort(x)
        print("%d - %d = %d"%(temp[0],temp[1],temp[0]-temp[1]))
        x = temp[0]-temp[1]
    return

if __name__ == "__main__":
    main()

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 17:59:05 | 显示全部楼层
def max_min(num):
    num = str(num)                              #把整数转成字符串
    num_list = list(num)                        #把字符串转成列表
    max_list = sorted(num_list,reverse = True)  #将列表从小到大排列
    if len(max_list) == 3:                      #计算最大值
        max_num = int(max_list[0])*1000+int(max_list[1])*100+int(max_list[2])*10
    else:
        max_num = int(max_list[0])*1000+int(max_list[1])*100+int(max_list[2])*10+int(max_list[3])
    min_list = sorted(num_list,reverse = False)
    if len(min_list) == 3:                      #计算最小值
        min_num = int(min_list[0])*100+int(min_list[1])*10+int(min_list[2])
    else:
        min_num = int(min_list[0])*1000+int(min_list[1])*100+int(min_list[2])*10+int(min_list[3])
    chazhi = max_num-min_num                    #计算差值
    print('max=%d,min=%d,cha=%d'%(max_num,min_num,chazhi))  #调试信息
    return max_num,min_num,chazhi

input_num  = input('请输入一个4位数...\r\n注意:1111,2222,3333,4444,5555,6666,7777,8888,9999除外')
global chazhi,max_num,min_num     #定义一些变量
count = 0
chazhi = int(input_num)           #把输入的转成整数
while chazhi != 6174:
    max_num,min_num,chazhi=max_min(chazhi)      #这里直接写max_min(chazhi)怎么不行
    count +=1
    print('运算%d次'%count)
print('完成')
测试.png

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 18:00:03 | 显示全部楼层
woduhaitao 发表于 2018-2-23 17:59
def max_min(num):
    num = str(num)                              #把整数转成字符串
    num_list = ...

while循环里直接写max_min()怎么不行

点评

每次循环chazhi都会变化,函数需带入新的插值  发表于 2018-2-25 21:58
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-23 18:04:56 | 显示全部楼层
本帖最后由 supperboys 于 2018-2-23 22:12 编辑

  1. __magic_number = 6174


  2. def get_max_or_min(number_list, reverse=False):
  3.     number_list.sort(reverse=reverse)
  4.     numbers = number_list
  5.     result_str = ""
  6.     for num in numbers:
  7.         result_str += num
  8.     return int(result_str)

  9. number = list(input("请输入4位数字 例:3452\n"))

  10. while True:
  11.     min_number = get_max_or_min(number)
  12.     max_number = get_max_or_min(number, True)

  13.     if max_number < 1000:
  14.         max_number *= 10

  15.     result = max_number - min_number
  16.     print(str(max_number)+"-"+str(min_number)+"="+str(result))
  17.     if result == __magic_number:
  18.         break
  19.     number = list(str(result))

复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-23 18:35:28 | 显示全部楼层
while 1:
    num = input('输入一个四位数数:')
    if not num.isnumeric() or len(num)!=4:
        print(',输入有误,请重新输入!')
    else:
        break
count = 0
while 1:
    num_list = []
    if len(num) == 4:
        for n in range(4):
            num_list.append(num[n])
#        print(num_list)
        num_list_copy =num_list.copy()
        num_list.sort()
        num_list_copy.sort(reverse = True)
#        print(num_list_copy)
        num_new_min = num_list[0]+num_list[1]+num_list[2]+num_list[3]
        num_new_max = num_list_copy[0]+num_list_copy[1]+num_list_copy[2]+num_list_copy[3]
        num = str(int(num_new_max) - int(num_new_min))
        print(num_new_max,'-',num_new_min,'=',num)
        count += 1
    elif len(num) == 3:
        for n in range(3):
            num_list.append(num[n])
        num_list.append('0')
        num_list_copy =num_list.copy()
        num_list.sort()
        num_list_copy.sort(reverse = True)

        num_new_min = num_list[0]+num_list[1]+num_list[2]+num_list[3]
        num_new_max = num_list_copy[0]+num_list_copy[1]+num_list_copy[2]+num_list_copy[3]
        num = str(int(num_new_max) - int(num_new_min))
        print(num_new_max,'-',num_new_min,'=',num)
        count += 1
    else:
        for n in range(2):
            num_list.append(num[n])
        num_list.extend(['0','0'])
        num_list.append('0')
        num_list_copy =num_list.copy()
        num_list.sort()

        num_new_min = num_list[0]+num_list[1]+num_list[2]+num_list[3]
        num_new_max = num_list_copy[0]+num_list_copy[1]+num_list_copy[2]+num_list_copy[3]
        num = str(int(num_new_max) - int(num_new_min))
        print(num_new_max,'-',num_new_min,'=',num)
        count += 1
    if num == '6174':
        break
print(count)
        

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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