鱼C论坛

 找回密码
 立即注册
查看: 11945|回复: 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到四位。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2019-7-9 17:11:28 | 显示全部楼层
  1. from functools import reduce
  2. input_str=input('请输入四位正整数')
  3. max_list=sorted(input_str,reverse=True)
  4. min_list=sorted(input_str)
  5. def fun156(max_list,min_list):
  6.     max_num=reduce(lambda x,y:int(x)*10+int(y),max_list)
  7.     min_num=reduce(lambda x,y:int(x)*10+int(y),min_list)
  8.     while max_num-min_num!=6174:
  9.         if max_num==min_num:
  10.             max_num*=10
  11.         print(f'{max_num}-{min_num}={max_num-min_num}')
  12.         new_str=str(max_num-min_num)
  13.         max_list=sorted(new_str,reverse=True)
  14.         min_list=sorted(new_str)
  15.         max_num=reduce(lambda x,y:int(x)*10+int(y),max_list)
  16.         min_num=reduce(lambda x,y:int(x)*10+int(y),min_list)
  17.     print(f'{max_num}-{min_num}={max_num-min_num}')
  18. fun156(max_list,min_list)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-9 09:56:55 | 显示全部楼层
def toList(n):
    a = []
    while n < 1000:
        n *= 10
    for i in str(n):
        a.append(int(i))
    a.sort()
    return a
def maxa(n):   
    rep = 0
    a = toList(n)
    a.reverse()
    for i in a:
        rep = rep*10+i
    return rep
def mina(n):
    rep = 0
    a = toList(n)
    for i in a:
        rep = rep*10+i
    return rep     
while True:
    n = input('请输入四位非重复数字:')
    if not n:
        break
    n=int(n)
    while (n - 6174):
        a=maxa(n)
        b=mina(n)
        n=a-b
        print("%d-%d=%d"%(a,b,n))
        
   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-5 12:00:38 | 显示全部楼层
本帖最后由 咕咕鸡鸽鸽 于 2019-5-5 12:24 编辑
  1. def fun156(num):
  2.     while num != 6174:
  3.         if len(str(num)) != 4:
  4.             num = int(str(num) + (4 - len(str(num)))*"0")
  5.         max1 = int("".join(sorted(list(str(num)),reverse=True)))
  6.         min1 = int("".join(sorted(list(str(num)))))
  7.         num = max1 - min1
  8.         print("{} - {} = {}".format(max1,min1,num))
  9.         
  10.     print("over")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-18 21:14:21 | 显示全部楼层
  1. def getCountProgress(num) :
  2.         try :
  3.                 num = int(num)
  4.         except ValueError :
  5.                 print('输入的值有误!')
  6.                 return
  7.         if len(str(num)) != 4 :
  8.                 print('输入的不是四位数!')
  9.                 return
  10.         num = str(num)
  11.         i = 0
  12.         while i < 7 :
  13.                 print('%d - %d = %d' % (getMaxNum(num), getMinNum(num), getMaxNum(num) - getMinNum(num)))
  14.                 if len(num) < 4 :
  15.                         num = str(int(num) * len(num) ** 10)
  16.                 else :
  17.                         num = str(getMaxNum(num) - getMinNum(num))
  18.                 i += 1

  19. def getMaxNum(num) :
  20.         list1 = list(num)
  21.         for i in range(len(list1) - 1) :
  22.                 for j in range(len(list1) - i - 1) :
  23.                         if list1[j] < list1[j + 1] :
  24.                                 list1[j], list1[j + 1] = list1[j + 1], list1[j]
  25.         return int(''.join(list1))


  26. def getMinNum(num) :
  27.         list1 = list(num)
  28.         for i in range(len(list1) - 1) :
  29.                 for j in range(len(list1) - i - 1) :
  30.                         if list1[j] > list1[j + 1] :
  31.                                 list1[j], list1[j + 1] = list1[j + 1], list1[j]
  32.         return int(''.join(list1))

  33. a = input('请输入一个四位数:')
  34. getCountProgress(a)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-12 16:58:42 | 显示全部楼层
  1. def number_sort(n):
  2.     ls_min = sorted([x for x in list(str(n))])
  3.     ls_max = list(reversed(ls_min))
  4.     min_n = ""
  5.     max_n = ""
  6.     for i in ls_min:
  7.         min_n += i
  8.     for j in ls_max:
  9.         max_n += j
  10.     return int(max_n), int(min_n)


  11. def number_count():
  12.     number = input("请输入一个4位正整数:")
  13.     for _ in range(7):
  14.         nums = number_sort(number)
  15.         diff = nums[0]-nums[1]
  16.         print("%d - %d = %d" % (nums[0], nums[1], diff))
  17.         number = diff
  18.         if number == 6174:
  19.             return


  20. if __name__ == "__main__":
  21.     number_count()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-10 10:33:03 | 显示全部楼层
def fun(num):
    num_list = list(str(num))
    num_list.sort(reverse=True)
    max_num = int("".join(num_list))
    num_list.sort()
    min_num = int("".join(num_list))
    next_num = max_num - min_num
    print("%d-%d=%d"%(max_num, min_num, next_num))
    if len(str(next_num)) < 4:
        a = str(next_num)
        lent = len(a)
        next_num = int(a+"0"*(4-lent))
    if next_num != 6174:
        print(next_num)
        fun(next_num)
    else:
        print(next_num)
        return next_num
fun(7767)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-18 23:45:30 | 显示全部楼层
a=int(input())
while a!=6174 :
    jl=[]
    while a!=0 :
        jl+=[a % 10]
        a=a//10
    while len(jl)<4 :
        jl+=[0]
    jl.sort()
    a1=jl[0]*1000+jl[1]*100+jl[2]*10+jl[3]
    jl.reverse()
    a2=jl[0]*1000+jl[1]*100+jl[2]*10+jl[3]
    a=a2-a1
    print(a2,'-',a1,'=',a)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-13 11:09:50 | 显示全部楼层
inputnum=input("请输入数字:")
for  u   in range(1,8):
list1=[]
i=inputnum[0]
j=inputnum[1]
m=inputnum[2]
n=inputnum[3]
if i==j==m==n:
    print("您输入的数字不符合规则")
    break
else:
   tollist=[]
   for  ii  in  range(0,4):
     for  jj    in  range(0,4):
        for mm   in   range(0,4):
            for  nn   in  range(0,4):
                list2=["","","",""]
                if ii==jj or  ii==mm or ii==nn or jj==mm or jj==nn  or mm==nn:
                    pass
                else:
                  list2[ii]=str(i)
                  list2[jj]=str(j)
                  list2[mm]=str(m)
                  list2[nn]=str(n)
                  str1="".join(list2)
                  tollist.append(int(str1))
   maxnum=max(tollist)
   minnum=min(tollist)
   print("第"+str(u)+"次结果为:"+str(maxnum-minnum))
   if maxnum-minnum==6174:
       break
   else:
    inputnum=str(maxnum-minnum)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-5 20:41:48 | 显示全部楼层
  1. def f(a):
  2.         a = list(str(a))
  3.         min = int(''.join(i for i in sorted(a)))
  4.         max = int(''.join(i for i in sorted(a,reverse = True)))
  5.         print(max,'-',min)
  6.         return max-min
  7.        
  8. if __name__ == '__main__':
  9.         a = int(input())
  10.         while True:
  11.                 a = f(a)
  12.                 if a<1000:
  13.                         a *= 10
  14.                 if a == 6174:
  15.                         print('success')
  16.                         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-4 16:59:20 | 显示全部楼层
  1. def a(x):
  2.     L=list(str(x))
  3.     L.sort()
  4.     s=''
  5.     for i in L:
  6.         s+=i
  7.     a=eval(s[::-1])
  8.     b=eval(s.replace('0',''))
  9.     c=a-b
  10.     print(a,'-',b,'=',c)
  11.     return c
  12. def b(x):
  13.     c=x
  14.     while 1:
  15.         c=a(c)
  16.         if c==6174:
  17.             break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-4 14:54:05 | 显示全部楼层
本帖最后由 瞬秒爆加速 于 2018-3-4 14:55 编辑
  1. a = input()
  2. while True:
  3.     b = [i for i in str(a)]
  4.     if len(b) < 4:
  5.         b.append('0')
  6.     #从小到大排序
  7.     b.sort()
  8.     c = b[:]
  9.     #反序
  10.     b.reverse()
  11.     bb,cc = int("".join(b)),int("".join(c))
  12.     print(("%d-%d=%d")%(bb,cc,bb-cc))
  13.     a = bb-cc
  14.     if a == 6174:
  15.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-3 20:21:09 | 显示全部楼层
  1. def count(number):
  2.     a = list(map(int, str(number)))

  3.     n1 = max(a)
  4.     a.remove(n1)
  5.     n2 = max(a)
  6.     a.remove(n2)
  7.     n3 = max(a)
  8.     a.remove(n3)
  9.     if len(a) != 0:
  10.         n4 = max(a)
  11.     else:
  12.         n4 = 0

  13.     s1 = (n1 * 1000 + n2 * 100 + n3 * 10 + n4)
  14.     s2 = (n4 * 1000 + n3 * 100 + n2 * 10 + n1)
  15.     result = s1 - s2
  16.     print("%d-%d=%d" % (s1, s2, result))
  17.     return result


  18. def main():
  19.     number = input("number=")
  20.     while number != 6174:
  21.         number = count(number)


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

使用道具 举报

发表于 2018-3-3 17:35:58 | 显示全部楼层
print("输入一个每位数不完全相同的四位正整数:",end = "")
i = int(input())
while i != 6174:
    if i % 1111 == 0:
        print("输入有误,请输入一个每位数不完全相同的四位正整数:")
        i = input()
    i = list(str(i))
    if len(i) == 3:
        i.sort()
        x = int(i[0])*100 + int(i[1])*10 + int(i[2])
        y = int(i[2])*1000 + int(i[1])*100 + int(i[0])*10
        i = y - x
        print("%d - %d = %d" % (y,x,i))
    else:
        i.sort()
        x = int(i[0])*1000 + int(i[1])*100 + int(i[2])*10 + int(i[3])
        y = int(i[3])*1000 + int(i[2])*100 + int(i[1])*10 + int(i[0])
        i = y - x
        print("%d - %d = %d" % (y,x,i))
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-2 08:46:49 | 显示全部楼层
°蓝鲤歌蓝 发表于 2018-2-23 12:34
我觉得如果输入的数是6174本身的话就不用输出计算步骤了。

诶呀,我怎么就没有想到小于1000的乘以10呢。。。。。学习了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-2 08:44:08 | 显示全部楼层
def max_transform(number):
        list1 = []
        while number:
                bit = number%10
                list1.append(bit)
                number = number // 10

        temp1 = list1[:]
        temp1.sort(reverse = True)
        max_number = 0
        for i in range(len(temp1)):
                max_number = temp1[i]*(10**(3-i)) + max_number

        return max_number


def min_transform(number):
        list1 = []
        while number:
                bit = number % 10
                list1.append(bit)
                number = number // 10
        list1.sort()
        min_number = 0
        for i in range(len(list1)):
                min_number = list1[i] * (10 ** (len(list1)-1-i)) + min_number
        return min_number




def is_three_bit(number):
        list1 = []
        while number:
                bit = number % 10
                list1.append(bit)
                number = number // 10

        list1.append(0)
        result = 0
        for i in range(len(list1)):
                result = result + list1[i] * (10**(3-i))
        return result

def bit_chk(number):
        list1 = []
        while number:
                bit = number % 10
                list1.append(bit)
                number = number // 10
        if len(list1) == 3:
                return 3
        else:
                return 4


if __name__ == '__main__':
        number = int(input('请输入参数:'))
        while number != 6174:
                if bit_chk(number) == 3:
                        temp = is_three_bit(number)
                        max_number = max_transform(temp)
                        min_number = min_transform(number)
                        print('%d - %d = %d' % (max_number,min_number,max_number - min_number))
                        number = max_number - min_number
                else:
                        max_number = max_transform(number)
                        min_number = min_transform(number)
                        print('%d - %d = %d' % (max_number,min_number,max_number - min_number))
                        number = max_number - min_number

        print('执行完毕')
#################################
第一次运行结果:
请输入参数:2687
8762 - 2678 = 6084
8640 - 468 = 8172
8721 - 1278 = 7443
7443 - 3447 = 3996
9963 - 3699 = 6264
6642 - 2466 = 4176
7641 - 1467 = 6174
执行完毕

***Repl Closed***
#####################
第二次运行结果i:
请输入参数:7767
7776 - 6777 = 999
9990 - 999 = 8991
9981 - 1899 = 8082
8820 - 288 = 8532
8532 - 2358 = 6174
执行完毕

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

使用道具 举报

发表于 2018-3-1 19:07:57 | 显示全部楼层
  1. def sort(num):
  2.     if len(num) == 3:
  3.         num += '0'
  4.     list1 = [int(num[0]),int(num[1]),int(num[2]),int(num[3])]
  5.     for i in range(4):
  6.         for j in range(4 - i -1):
  7.             if int(list1[j]) > int(list1[j + 1]):
  8.                 temp = list1[j]
  9.                 list1[j] = list1[j + 1]
  10.                 list1[j + 1] = temp
  11.     num = str(list1[0]) + str(list1[1]) + str(list1[2]) + str(list1[3])
  12.     return num

  13. def magic_num(num):
  14.     result = int(num)
  15.     while(result != 6174):
  16.         num = sort(str(result))
  17.         Max = num[3] + num[2] + num[1] + num[0]
  18.         result = int(Max) - int(num)
  19.         print("%d = %d - %d" % (result,int(Max),int(num)))

  20. x = input("请输入一个不完全相同的四位数:")
  21. magic_num(x)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-27 20:24:24 | 显示全部楼层
temp=input('请输入一个四位数(全相同除外):')
   
def getnumber(liebiao):#列表转化为数字
    summ=0
    for i in range(4):
        summ+=int(liebiao[i])*10**(3-i)
    return summ


def getbig(number):#获得大数
    a=list(number)
    a.sort()
    a.reverse()
    big=getnumber(a)
    return big

def getsmall(number):#获得小数
    a=list(number)
    a.sort()
    small=getnumber(a)
    return small

def fun(temp1):
    t=getbig(temp1)-getsmall(temp1)
    if  t == 6174:
        print('得到6174,程序结束')
    else:
        t=str(t)
        fun(t)

fun(temp)

   
   才疏学浅,只能这样了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-27 17:54:55 | 显示全部楼层
6174真的好神奇啊~

  1. def sort_data(i1):
  2.     s1 = sorted(list(str(i1)))
  3.     min = int(''.join(s1))
  4.     s1.reverse()
  5.     if len(s1) < 4:
  6.         for i in range(4 - len(s1)):
  7.             s1.append('0')
  8.     max = int(''.join(s1))
  9.     return max, min

  10. str1 = input("请输入一个四位正整数(每一位数字不完全相同):")

  11. d1 = int(str1)
  12. while d1 != 6174:
  13.     max, min = sort_data(d1)
  14.     d1 = max - min
  15.     print("%d - %d = %d" % (max, min, d1))
复制代码


结果:
请输入一个四位正整数(每一位数字不完全相同):6665
6665 - 5666 = 999
9990 - 999 = 8991
9981 - 1899 = 8082
8820 - 288 = 8532
8532 - 2358 = 6174
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-26 13:28:34 | 显示全部楼层
  1. from itertools import permutations

  2. def fun156(x):
  3.     while True:
  4.         list_permutations = [int(''.join(i)) for i in permutations(str(x))]
  5.         x = max(list_permutations) - min(list_permutations)
  6.         yield '%s-%s=%s'%(max(list_permutations),min(list_permutations),x)
  7.         if x == 6174:
  8.             break
  9.         if x < 1000:
  10.             x *= 10

  11. if __name__ == '__main__':
  12.     x = int(input('请输入各位数不尽相同的四位数数字:'))
  13.     while str(x).count(str(x)[0]) == 4 or len(str(x)) != 4:
  14.         x = int(input('数字不符合要求,请输入各位数不尽相同的四位数数字:'))
  15.     for i in fun156(x):
  16.         print(i)
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-4-1 18:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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