鱼C论坛

 找回密码
 立即注册
楼主: 冬雪雪冬

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

[复制链接]
发表于 2018-2-24 15:46:38 | 显示全部楼层
晓屁屁 发表于 2018-2-24 11:16
# -*- coding:utf-8 -*-
def four_num(innum):           #这个def是返回最大四位数
    max_num = sorte ...

老师   我写出来了   代码在后面  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-24 15:56:16 | 显示全部楼层
本帖最后由 colinshi 于 2018-2-24 16:13 编辑
  1. def d6174(num):
  2.     tmp =[]
  3.     for i in str(num):
  4.         tmp.append(int(i))
  5.     while len(tmp) != 4:
  6.         tmp.append(0)
  7.     if len(set(tmp)) == 1:
  8.         print('4位数字不能相同')
  9.         return False
  10.     elif num == 6174:
  11.         print('输入的数字就是6174')
  12.         return True
  13.     tmp.sort()
  14.     min_num = tmp[0]*1000+tmp[1]*100+tmp[2]*10+tmp[3]
  15.     max_num = tmp[0]+tmp[1]*10+tmp[2]*100+tmp[3]*1000
  16.     res = max_num - min_num
  17.     print(res,'=',max_num,'-',min_num)
  18.     if res == 6174:
  19.         print('找到数字可以变成6174')
  20.         return True
  21.     else:
  22.         return d6174(res)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-24 16:57:01 | 显示全部楼层
本帖最后由 lyjlyj 于 2018-2-24 17:07 编辑

  1. #coding:utf-8
  2. #python2.7
  3. while 1:
  4.     try:
  5.         num = input("请输入一个四位的整数:")
  6.         if num>=1000 and num<9999:
  7.             while 1:
  8.                 list_num = [num/1000,num//100%10,num//10%10,num%10]
  9.                 list_num = sorted(list_num)
  10.                 min = list_num[0]*1000 + list_num[1]*100 + list_num[2]*10 + list_num[3]
  11.                 max = list_num[0]+list_num[1]*10 + list_num[2]*100 + list_num[3]*1000
  12.                 if max<1000:
  13.                     max *= 10
  14.                 if max == min:
  15.                     print "不能是1111,2222这样的数"
  16.                     break
  17.                 num = max - min
  18.                 print "%d - %d = %d"%(max,min,num)
  19.                 if num==6174:
  20.                     break
  21.     except Exception:
  22.         pass
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-24 17:49:33 | 显示全部楼层
  1. def sub(num, i = 0):
  2.       
  3.       min_list = sorted(num)
  4.       min_num = int(''.join(min_list))
  5.       max_list = reversed(min_list)
  6.       max_num = int(''.join(max_list))

  7.       diff = max_num - min_num

  8.       print('%d - %d = %d' % (max_num, min_num, diff))

  9.       if diff < 1000:
  10.             diff_new = diff*10 - diff
  11.             print('%d - %d = %d' % (diff*10, diff, diff_new))
  12.             i += 2
  13.             sub(str(diff_new), i)
  14.             
  15.       
  16.       elif diff != 6174:
  17.             i += 1
  18.             sub(str(diff), i)


  19.       else:
  20.             print('共用了%d次' % (i+1))
  21.             if i+1 < 8:
  22.                   print('成功')
  23.             

  24.       

  25. if __name__ == '__main__':

  26.       i = 0
  27.       num = input('请输入四位数(不能全相同):')

  28.       if not num.isdigit():
  29.             print('请输入数字!')
  30.       elif not 999 < int(num) < 10000:
  31.             print('请输入四位数!')
  32.       else:
  33.             sub(num, i)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-24 19:02:05 | 显示全部楼层
本帖最后由 leonid_bj 于 2018-2-24 19:04 编辑

# -*-coding:utf-8-*-

temp = int(input("Please input an integer with 4 digits:"))
# we assume that the integer is legal

def int2list(x, n):
    result = []
    for i in range(n-1,-1,-1):
        each = x / (10**i)
        result.append(int(each))
        x = x % (10**i)
    return result

digits = int2list(temp, 4)
sub = []
g = lambda x: x[0]*1000 + x[1]*100 + x[2]*10 + x[3]
for i in range(7):
    digits.sort()
    up = g(digits)
    digits.reverse()
    down = g(digits)
    sub.append(down - up)

    if sub==6174:
        break
    digits = int2list(sub, 4)

print("{0} use {1} times to achieve {2}.".format(temp, i+1, sub))
print(sub)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-2-24 19:41:47 | 显示全部楼层
本帖最后由 纳兰小寒 于 2018-2-25 15:21 编辑
  1. def cal(num):
  2.     l = list(num)
  3.     minnum = ''
  4.     maxnum = ''
  5.     l.sort()
  6.     for i in l:
  7.         minnum += str(i)
  8.     minnum = int(minnum)
  9.     l.reverse()
  10.     for i in l:
  11.         maxnum += str(i)
  12.     if len(maxnum) < 4:
  13.         maxnum += '0'
  14.     maxnum = int(maxnum)
  15.     print('{0} - {1} = {2}'.format(maxnum,minnum,maxnum-minnum))
  16.     return maxnum - minnum



  17. result = input('请输入一个4位数的数字:')
  18. while(len(result) != 4):
  19.     result = input('请输入一个4位数的数字:')
  20. while(result != 6174):
  21.     result = cal(str(result))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-24 22:20:46 | 显示全部楼层
  1. '''
  2. 6174是个神奇的数字,一个任意的四位正整数(全相同的除外,如1111)。
  3. 将数字重新组合成一个最大的数和最小的数相减,重复这个过程,最多七步,必得6174。
  4. 现在编程验证此现象,输入一个每位数不完全相同的四位正整数,给出计算过程,最终得到6174
  5. '''

  6. #设计一个函数,输入4个数为元素的列表,输出一个4位数
  7. def list_number(l):
  8.     return l[0]*1000+l[1]*100+l[2]*10+l[3]

  9. #设计一个函数,输入4位数,输出一个其各位数字重新组合后的最大和最小数
  10. def max_min1(n):
  11.     x=n
  12.     k=1000
  13.     l=[]
  14.     for i in range(4):
  15.         l.append(x//k)
  16.         x=x%k
  17.         k=k//10
  18.     l.sort()
  19.     nx=list_number(l)
  20.     l.reverse()
  21.     ny=list_number(l)
  22.     return ny,nx

  23. #设计一个函数,处理特殊情况,输入为小于4位数的数字,输出一个本身的10倍数加本身
  24. def max_min2(n):
  25.     m=n
  26.     while m<1000:
  27.         m=m*10
  28.     return m,n

  29. number=int(input('请输入一个每位数不完全相同的4位数:'))
  30. counter=0
  31. n=number
  32. while True:
  33.     if n>999:
  34.         x=max_min1(n)[0]
  35.         y=max_min1(n)[1]
  36.         z=x-y
  37.     else:
  38.         x=max_min2(n)[0]
  39.         y=max_min2(n)[1]
  40.         z=x-y
  41.     print(x,'-',y,'=',z)
  42.     counter+=1
  43.     n=z
  44.     if z==6174 or counter>7:
  45.         break

  46.    
  47.            
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-25 01:57:53 | 显示全部楼层
本帖最后由 Ruicker 于 2018-2-25 13:08 编辑
  1. num_str = input('请输入要验证的数字(必须为每位数不完全相同的四位正整数):')
  2. while True:
  3.         if (not num_str.isnumeric()) or (len(num_str) != 4) or (num_str.count(num_str[0]) == 4):
  4.                 num_str = input('别玩了,快输入正确的数:')
  5.         else:
  6.                 break
  7. while True:
  8.         num_list = [num_str[0],num_str[1],num_str[2],num_str[3]]
  9.         num_list.sort()
  10.         temp1 = num_list[:]
  11.         num_list.reverse()
  12.         temp2 = num_list[:]
  13.         Max = int(temp1.pop()+temp1.pop()+temp1.pop()+temp1.pop())
  14.         Min = int(temp2.pop()+temp2.pop()+temp2.pop()+temp2.pop())
  15.         num = Max-Min
  16.         print('%4d-%4d=%4d' % (Max,Min,num))
  17.         if num == 6174:
  18.                 print('得到目标数!\n程序结束。')
  19.                 break
  20.         num_str = str(num)
  21.         while len(num_str) < 4:
  22.                 num_str += '0'
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-25 09:51:51 | 显示全部楼层
  1. #-*- coding:utf-8 -*-
  2. def big(k):
  3.     k.sort(reverse=True)
  4.     r=''
  5.     for i in k:
  6.         r=r+str(i)
  7.     return int(r)

  8. def small(k):
  9.     k.sort()
  10.     r=''
  11.     for i in k:
  12.         r=r+str(i)
  13.     return int(r)
  14.    
  15. def run(k):
  16.     L=[]
  17.     for x in str(k):
  18.         L.append(int(x))
  19.     b=big(L)
  20.     s=small(L)
  21.     balance=b-s
  22.     print(str(b)+'-'+str(s)+'='+str(balance))
  23.     if balance==6174:
  24.         return
  25.     else:
  26.         if len(str(balance))==3:
  27.             balance=int(str(balance)+'0')
  28.         run(balance)

  29. def main():
  30.     while True:
  31.         k=input('please input 4 number:')
  32.         try:
  33.             k=int(k)
  34.             if len(str(k))==4:
  35.                 m=[]
  36.                 for y in str(k):
  37.                     m.append(y)
  38.                 m=list(set(m))
  39.                 if len(m)!=1:
  40.                     run(k)
  41.                 else:
  42.                     print('4位数的每一位不能都为同一个数')
  43.             else:
  44.                 print('长度错误,必须4位长度')
  45.         except ValueError:
  46.             print('输入错误')

  47. main()

  48.    
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-25 10:23:20 | 显示全部楼层
本帖最后由 laurence5181 于 2018-2-26 22:17 编辑

剛學習編程的新手 每日練習奠定穩固的編程基礎!

  1. def concatenate_list(list1):   #將sorted()得到的list轉為int
  2.     result = ""
  3.     for element in list1:
  4.         result += str(element)
  5.     return int(result)


  6. num = str(input("請輸入任意四位正整數(全相同除外):"))
  7. i = 0
  8. while i<7:
  9.     max_num = sorted(num, reverse=True)
  10.     min_num = sorted(num)

  11.     result = concatenate_list(max_num) - concatenate_list(min_num)
  12.            
  13.     num = str(result).zfill(4)     #補齊三位數所缺少的0
  14.     i += 1
  15.     print("%d - %d = %d" % (concatenate_list(max_num),\
  16.                             concatenate_list(min_num), int(num)))
  17.     if result == 6174:
  18.          break

复制代码


底下多了if判斷 解決重複算的問題
謝謝冬雪雪冬大大提醒

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3 7677时多算了2次

查看全部评分

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

使用道具 举报

发表于 2018-2-25 18:31:55 | 显示全部楼层
import random

def ListJianFa(max,min):
    flag=False
    result_list=[]
    for i in range(3,-1,-1):
        if flag == True:
            max[i]-=1
            flag = False
        if max[i] >= min[i]:
            flag = False
            result_list.append(max[i] - min[i])
        else:
            flag = True
            result_list.append(max[i] + 10 - min[i])
    result_list.reverse()

    return result_list

def ListMaxMin(temp):
    a_max = sorted(temp, reverse=True)
    a_min = sorted(temp, reverse=False)
    if a_min==a_max:
        print("不能为4位相同数")
        return
    result_list = ListJianFa(a_max, a_min)
    b_list = list(map(str, result_list))
    b_str=''.join(b_list)
    if int(b_str)!=6174:
        ListMaxMin(result_list)
    return result_list

def ListMaxMin2(temp,num):
    a_max = sorted(temp, reverse=True)
    a_min = sorted(temp, reverse=False)
    if a_min == a_max:
        print("不能为4位相同数")
        return
    result_list= ListJianFa(a_max, a_min)
    b_list = list(map(str, result_list))
    b_str=''.join(b_list)
    print(b_str)
    num=num+1
    if int(b_str)!=6174:
        (a, num)=ListMaxMin2(result_list,num)
    return (result_list,num)

a=random.randint(1000,9999)
print(a)
a_list=list(map(int,str(a)))
ListMaxMin(a_list)
(result_list,num)=ListMaxMin2(a_list,0)
b_list = list(map(str, result_list))
b_str=''.join(b_list)
print(num,'<=7 满足条件',a,'计算结果为:',b_str)

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-25 18:38:33 | 显示全部楼层
谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-25 20:13:53 | 显示全部楼层
  1. def gen_max_min(n):
  2.     s = str(n)
  3.     n_max = ''.join(sorted(s, reverse=True))
  4.     n_max += "0" * (4 - len(n_max))
  5.     n_max = int(n_max)
  6.    
  7.     n_min = ''.join(sorted(s, reverse=False))
  8.     n_min += "0" * (4 - len(n_min))
  9.     n_min = int(n_min)
  10.    
  11.     return n_max, n_min

  12. while n != 6174:
  13.     n_max, n_min = gen_max_min(n)
  14.     n = n_max - n_min
  15.     print("{} - {} = {}".format(n_max, n_min, n))
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2018-2-25 23:00:25 | 显示全部楼层
mark
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-2-26 09:37:47 | 显示全部楼层
  1. def f(n):
  2.     N = str(n)
  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) if len(str(big - small)) == 4 else str(big - small)+'0'

  8. f(2687)
复制代码

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> 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)

   
   才疏学浅,只能这样了
想知道小甲鱼最近在做啥?请访问 -> 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)
复制代码
想知道小甲鱼最近在做啥?请访问 -> 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***
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 01:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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