1064 朋友数 (20 分)
题意描述:
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。
输入格式:
输入第一行给出正整数 N。随后一行给出 N 个正整数,数字间以空格分隔。题目保证所有数字小于 10^4 。
输出格式:
首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格。
输入样例:
8
123 899 51 998 27 33 36 12
输出样例:
4
3 6 9 26
解题思路:
Alice: 朋友证号好像和朋友没什么关系呀,你看每个数字的朋友证号就是它各位数字之和 啊,就算它么有朋友也是这个证号。只有两个数字的朋友证号是一样的时候,它俩才是朋友数。
Bob: 对呀,那这样求一堆数的朋友证号,就是求这些数字 各位数字之和啊。只要去重,然后再排一下序就好了。
Alice: 去重用set( )
好了,又快又方便。排序怎么办?set 对象好像没有sort ()
方法。
Bob: 用sorted( )
?? 我去试一试。(1 mins later)可以的,sorted( ) 参数为集合的时候直接返回了对集合中元素排好顺序的列表。
Alice: hiahia,已经通过了。
代码:
def main():
N = int(input())
# 接收输入的正整数 N
inputs = [x for x in input().split()]
# 接收输入的N 个正整数
answer = set()
# 用来存储不同的朋友编号,使用set()可以直接得到不重复的朋友编号。
for string in inputs:
answer.add(sum([int(x) for x in string]))
# 计算每个人的朋友编号
answer = list(sorted(answer))
# 对所有的朋友编号排序
print(len(answer))
# 输出朋友编号的数量
print(" ".join([str(x) for x in answer]))
# 从小到大输出所有的朋友编号
if __name__ == '__main__':
main()
易错点:
- 每个数字都有一个朋友证号,与其他数字无关。
- 输出要求的是不同的朋友证号,而且是递增顺序。
总结: