首页 > 试题广场 >

1019. 数字黑洞 (20)

[编程题]1019. 数字黑洞 (20)
  • 热度指数:38213 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到
一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的6174,这个神奇的数字也叫Kaprekar常数。

例如,我们从6767开始,将得到

7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
... ...

现给定任意4位正整数,请编写程序演示到达黑洞的过程。

输入描述:
输入给出一个[1000, 10000)区间内的正整数N。


输出描述:
如果N的4位数字全相等,则在一行内输出“N - N = 0000”;否则将计算的每一步在一行内输出,直到6174作为差出现,输出格式见样例,每行中间没有空行。注意每个数字按4位数格
式输出。
示例1

输入

6767

输出

7766 - 6677 = 1089<br/> 9810 - 0189 = 9621<br/> 9621 - 1269 = 8352<br/> 8532 - 2358 = 6174
a = input()
if len(a) == 4 and a[0] == a[1] == a[2] == a[3] or a == '0':
    print('{} - {} = {}'.format(a,a,'0000'))
elif a == '6174':
    print('7641 - 1467 = 6174')
else:
    while a != '6174':
        L = list(a.rjust(4, '0'))
        A = ''.join(sorted(L, reverse = True))
        B = ''.join(sorted(L))
        a = str(int(A) - int(B)).rjust(4, '0')
        print('{} - {} = {}'.format(A,B,a))

发表于 2019-08-27 22:07:43 回复(0)
#python解法
#--------------------------
num_list=list(input().zfill(4))
while True:
    num_list.sort(reverse=True)
    num1=''.join(num_list)
    num_list.sort(reverse=False)
    num2=''.join(num_list)
       
    if int(num1)-int(num2) == 6174:
        print("%s - %s = 6174"%(num1,num2))
        break
    else: 
        result=int(num1)-int(num2)
        if result == 0:
            print("%s - %s = 0000"%(num1,num2))
            break
        else:
            print("%s - %s = %s"%(num1,num2,result))
            num_list=list(str(result))

发表于 2019-07-16 21:53:34 回复(0)
# -*- coding:utf-8 -*-
def to_num(nums):
    num = 0
    for i in range(len(nums)):
        num = num * 10 + nums[len(nums) - i - 1]
    return num


def handle(numstr):
    num = []
    for i in range(len(numstr)):
        num.append(int(numstr[i]))
    num.sort()
    num1 = to_num(num)
    num.sort(reverse=True)
    num2 = to_num(num)
    print('{:0>4} - {:0>4} = {:0>4}'.format(num1, num2, num1 - num2))
    return '{:0>4}'.format(num1 - num2)


def function():
    numstr = input()
    numstr = '{:0>4}'.format(numstr)
    if int(numstr) == 6174:
        numstr = handle(numstr)
    while int(numstr) != 6174:
        if int(numstr) == 0:
            break
        else:
            numstr = handle(numstr)


if __name__ == '__main__':
    function()
发表于 2019-05-13 17:50:35 回复(0)
def fun(in1):
    num = [0, 0, 0, 0]
    num[3] = in1 % 10  num[2] = int(in1 / 10) % 10  num[1] = int(in1 / 100) % 10  num[0] = int(in1 / 1000) if (num[0] == num[1] and num[1] == num[2] and num[2] == num[3]): print(str(in1) + " - " + str(in1) + " = 0000") else:
        num.sort()
        tempL = num
        numL = tempL[0] * 1000 + tempL[1] * 100 + tempL[2] * 10 + tempL[3]
        num.reverse()
        tempH = num
        numH = tempH[0] * 1000 + tempH[1] * 100 + tempH[2] * 10 + tempH[3]
        N = numH - numL if numL < 10: print(str(numH) + " - 000" + str(numL) + " = " + str(N)) elif numL < 100: print(str(numH) + " - 00" + str(numL) + " = " + str(N)) elif numL < 1000: print(str(numH) + " - 0" + str(numL) + " = " + str(N)) else: print(str(numH) + " - " + str(numL) + " = " + str(N)) if (N != 6174): return fun(N)

in1 = input()
in1 = int(in1)
fun(in1)

发表于 2019-03-19 23:27:35 回复(0)
import re
import string

def get6174(x):
    tmp = str(x).zfill(4)
    List = list(tmp)
    List.sort()
    SmallNumber = List[0] + List[1] + List[2] + List[3]
    List.reverse()
    BigNumber = List[0] + List[1] + List[2] + List[3]
    NewNumber = str(int(BigNumber) - int(SmallNumber)).zfill(4)
    print("{0} - {1} = {2}".format(BigNumber,SmallNumber,NewNumber))
    return NewNumber

Number = input()
CheckValue = get6174(int(Number))
while CheckValue != "6174" and CheckValue != "0000":
    CheckValue = get6174(CheckValue)

发表于 2019-03-08 09:09:49 回复(0)
n = input() if len(n) < 4:
    n = n+"0"*(4-len(n)) if len(n) == 4 and len(set(n)) == 1: print("%s - %s = 0000" % (n, n)) else:
    zheng = "".join(sorted(n,reverse=False))
    fan = "".join(sorted(n, reverse=True)) while True:
        new = int(fan) - int(zheng) if len(set(str(new))) == 1: print("%s - %s = 0000" % (n, n)) break  else: print("%s - %s = %d"%(fan,zheng,new)) if new == 6174: break  else:
                zheng = "".join(sorted(list(str(new)), reverse=False))
                fan = "".join(sorted(list(str(new)), reverse=True))
发表于 2019-02-13 22:51:31 回复(0)
N = (input()+'0000')[:4]

#  定义了一个生成器

def kapr(N):
    a = ''.join(sorted(str(N), reverse=True))
    b = ''.join(sorted(str(N)))
    k = int(a) - int(b)

    for i in range(10000):
    yield k, a, b
    a = ''.join(sorted(str(k), reverse=True))
    b = ''.join(sorted(str(k)))
    k = int(a) - int(b)


for j, a, b in kapr(N):
    if j == 0:
        print(a + ' - ' + b + ' = ' + '0000')
        break
    if j == 6174:
        print(a + ' - ' + b + ' = ' + str(j))
        break
    print(a + ' - ' + b + ' = ' + str(j))


编辑于 2018-11-07 20:36:20 回复(0)
N = input().zfill(4)
N1 = "".join(sorted(N, reverse=True))
N2 = "".join(sorted(N))
N = str(int(N1) - int(N2)) print("%04d - %04d = %04d" % (int(N1), int(N2), int(N))) while N != "6174" and N!="0":
    N1 = "".join(sorted(N, reverse=True))
    N2 = "".join(sorted(N))
    N = str(int(N1) - int(N2))  print("%04d - %04d = %04d"%(int(N1),int(N2),int(N)))

发表于 2018-11-03 17:48:28 回复(0)
try:
    while True:
        num = input()
        tempNum = "{:0>4}".format(num)      #在左边补充0达到4位,为字符串类型
        while True:
            tempNum = list(tempNum)         #变为列表进行排序
            tempMax = int("".join(sorted(tempNum,reverse=True)))
            tempMin = int("".join(sorted(tempNum)))
            tempResult = tempMax-tempMin
            if tempResult==0:              #等于0结束,格式化输出,在左边补零达到4位数
                print("{0:0>4} - {1:0>4} = {2:0>4}" .format(tempMax,tempMin,tempResult))
                break
            elif tempResult == 6174:      #等于6174结束
                print("{0:0>4} - {1:0>4} = {2:0>4}".format(tempMax, tempMin, tempResult))
                break
            else:                         #不结束继续循环查找
                print("{0:0>4} - {1:0>4} = {2:0>4}".format(tempMax, tempMin, tempResult))
                tempNum = "{:0>4}".format(tempResult)    #变为4位字符串继续查找
except Exception:
    pass
编辑于 2018-09-21 14:13:15 回复(0)
s=input()
s+='0'*(4-len(s))
while True:
    b=''.join(sorted(list(s)))
    a=b[::-1]
    s=str(int(a)-int(b)) if int(a)-int(b) else None
    print("{} - {} = {}".format(a,b,s or '0000'))
    if s=='6174' or not s:
        break
9行还有没有更简洁优雅的
编辑于 2018-07-27 22:14:26 回复(4)
n = input()


def kaprekar_num(n):
    if len(set(n)) == 1:
        print(n + ' - ' + n + ' = 0000')
        return '6174'
    else:
        num1 = ''.join(sorted(n, reverse=True))
        num2 = ''.join(sorted(n))
        result = str(int(num1) - int(num2))
        result = result.rjust(4, '0')
        result = ''.join(result)
        print(num1 + ' - ' + num2 + ' = ' + result)
        return result


n = kaprekar_num(n.rjust(4, '0'))
while n != "6174":
    n = kaprekar_num(n.rjust(4, '0'))

发表于 2017-11-15 20:28:58 回复(0)

python解法如下:

num = input()


def calc(num):
    if len(set(num)) == 1:
        print(num + " - " + num + " = 0000")
        return "6174"
    else:
        num1 = "".join(sorted(num, reverse=True))
        num2 = "".join(sorted(num))
        result = str(int(num1) - int(num2))
        print(num1 + " - " + num2 + " = " + result)
        return result

num=calc(num.ljust(4,"0"))
while num != "6174":
    num = calc(num.ljust(4,"0"))

注意有一个坑,如果输入3,要转化为0003这种形式。不然会输出0000.

发表于 2017-10-13 07:44:49 回复(6)
 def kaprekar(s1):
    if len(set(s1)) == 1:
        print '%s - %s = 0000' % (s1, s1)
        return
    s2 = s1
    t1 = list(s1)
    t2 = list(s2)
    t1.sort(reverse=True)
    fir = t1
    t2.sort()
    sec = t2
    fir_n = int(''.join(fir))
    sec_n = int(''.join(sec))
    res_n = fir_n - sec_n
    print '%04d - %04d = %04d' % (fir_n, sec_n, res_n)
    if res_n != 6174:
        kaprekar('%04d' % res_n)
 
try:
    while True:
        n = input()
        kaprekar('%04d' % n)
except EOFError:
    pass
人生苦短,我用Python
发表于 2016-11-03 16:20:47 回复(0)
def kaprekar(s1):
    if len(set(s1)) == 1:
        print '%s - %s = 0000' % (s1, s1)
        return
    s2 = s1
    t1 = list(s1)
    t2 = list(s2)
    t1.sort(reverse=True)
    fir = t1
    t2.sort()
    sec = t2
    fir_n = int(''.join(fir))
    sec_n = int(''.join(sec))
    res_n = fir_n - sec_n
    print '%04d - %04d = %04d' % (fir_n, sec_n, res_n)
    if res_n != 6174:
        kaprekar('%04d' % res_n)
try:
    while True:
        n = input()
        kaprekar('%04d' % n)
except EOFError:
    pass
人生苦短, 我用Python
发表于 2016-11-02 00:22:25 回复(0)