输入int类型范围内的N个非负整数,要求按各个整数的各数位上数字的平方和从小到大排序,若平方和相等则按数值从小到大排序。
例如,三个整数9、31、13各数位上数字的平方和分别为81、10、10,则排序结果为13、31、9。
输入格式:
测试数据有多组。每组数据先输入一个整数N(0<N<100),然后输入N个非负整数。若N=0,则表示输入结束。
输出格式:
对于每组测试,在一行上输出按要求排序后的结果,数据之间留一个空格。
输入样例:
9
12 567 91 33 657 812 2221 3 77
5
1 3 11 33 9
0
输出样例:
12 3 2221 33 812 91 77 567 657
1 11 3 33 9
代码实现:
import functools
def cul(a):
b = str(a)
cnt = 0
for i in b:
cnt += pow(int(i), 2)
return cnt
def cmp(a,b):
if cul(a)>cul(b):
return 1
elif cul(a)<cul(b):
return -1
else:
return 0
while True:
N = int(input())
if N == 0:
break
else:
mylist = list(map(int, input().split()))
mylist.sort()
mylist = sorted(mylist, key=functools.cmp_to_key(cmp))
print(' '.join(str(i) for i in mylist))
心得:
原本用字典写的,键是输入的数字,值是平方和,但是一直报错,后来发现是因为题目并没有说输入的数不可重复。下面附上之前写的版本(写都写了可不能白写
def cul(a):
b = str(a)
cnt = 0
for i in b:
cnt += pow(int(i), 2)
return cnt
while True:
N = int(input())
if N == 0:
break
else:
mydict = {}
mylist = list(map(int, input().split()))
mylist.sort()
for i in mylist:
mydict[i] = cul(i)
newlist = sorted(mydict.items(), key = lambda x:x[1])
newdict = {k:v for k, v in newlist}
print(newdict)
print(' '.join(str(i) for i in newdict.keys()))