题目
给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。例如,我们从6767开始,将得到
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
7641 - 1467 = 6174
… …
现给定任意 4 位正整数,请编写程序演示到达黑洞的过程。
输入格式:
输入给出一个 (0,1000 ) 区间内的正整数 N。
输出格式:
如果 N 的 4 位数字全相等,则在一行内输出 N - N = 0000;否则将计算的每一步在一行内输出,直到 6174 作为差出现,输出格式见样例。注意每个数字按 4 位数格式输出。
输入样例 1:
6767
输出样例 1:
7766 - 6677 = 1089
9810 - 0189 = 9621
9621 - 1269 = 8352
8532 - 2358 = 6174
输入样例 2:
2222
输出样例 2:
2222 - 2222 = 0000
分析
需要注意的点有点多,一不小心就会掉进坑里。
- 判断输入是否是四位数,不足四位数的要补零到四位数
- 判断两数相减是不是小于四位数,如果小于四位数也要补零到四位数再进行下一步运算
- 如果四位数里有元素零,在进行重新排列的时候,零作为千位是不能省略的
程序(python)
n=list("{:0<4}".format(input()))
flag=True
while flag:
n1=str().join(sorted(n))
n2=n1[-1::-1]
n="%04d"%(int(n2)-int(n1))
print("%s - %s = %s"%(n2,n1,n))
if n in ("0000","6174"):
flag=False
知识点
1 format函数
1.1 用于填充
print("my name is {} and i am {} years old".format("sam","14"))
输出结果:my name is sam and i an 14 years old
print("my name is {1} and i am {0} years old".format("sam","14"))
输出结果:my name is 14 and i am sam years old
1.2 保留n为小数
print("{:.2f}".format(3.1415))#四舍五入保留两位小数
输出结果:3.14
print("{:+.2f}".format(3.1415))#四舍五入保留两位小数,保留正负号
输出结果:+3.14
print("{:+.2f}".format(-3.1415))#四舍五入保留两位小数,保留正负号
输出结果:-3.14
1.3 用于对齐和填充数字
长度不够时,用指定的元素填充
:< — 左对齐
:> — 右对齐
:^ — 中间对齐
print("{:0>4}".format("45"))#以指定的"0"元素来将输入字符串补充到指定的4位
print("{:0<4}".format("45"))
print("{:0^4}".format("45"))
输出结果:0045
5400
0450
1.4 不同格式输出
print("{:.2%}".format(0.25))
print("{:,}".format(1000000))
print("{:.2e}".format(1000000))
输出结果:25.00%
1,000,000
1.00e+06
2 zfill方法给数字补零
n=123
print(n.zfill(5))
输出结果:00123
n=-123
print(n.zfill(5))
输出结果:-0123
3 格式化的方法给数字补零
n=123
print("%05d"%n)
输出结果:00123