朋友数
题目描述
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。
输入格式
输入第一行给出正整数 N。随后一行给出 N 个正整数,数字间以空格分隔。题目保证所有数字小于 $10^4$。
输出格式
首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格。
输入样例
1 | 8 |
输出样例
1 | 4 |
问题解决
解题思想
本题采用C++标准模板库(STL)的set
容器可以很方便的解决。set
容器的简单介绍请看下面的知识拓展。在输入的同时计算每个整数的朋友证号并将其加入set
中即可,由于set
本身会自动递增排序并去重,因此,去重和排序就不必我们亲自去实现了。
由题给样例可知,不一定要两个或两个以上的整数的朋友证号相同才统计输出,若某整数的朋友证号是唯一的,也要统计输出的。
知识拓展
set容器内元素的两个很重要的特性是:
- 自动递增排序
- 自动去除重复元素
使用set之前要添加上#include <set>
与using namespace std;
。
set的定义(以定义int和char型为例):
1 | set <int> st; |
set容器内元素的访问只能通过迭代器访问,如代码示例的输出。定义迭代器,按如下方式进行:
1 | set <int> :: iterator it; //it即为迭代器变量,初学者可按指针来理解 |
遍历整个st可用如下方式:
1 | for(set <int>::iterator it = st.begin(); it != st.end(); it++) { |
st.size()
是获得st内元素的个数。
更多相关set
的内容,请自行查阅相关书籍。
代码示例(C/C++)
1 |
|
题目来源:PAT乙级1064
作者:CHEN, Yue
单位:浙江大学