题目链接
https://pintia.cn/problem-sets/994805260223102976/problems/994805267416334336。
题面
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 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
题目分析
可以算是模板题。
解题思路
读取数据,计算各位和,统计数据。
数学知识
没有吧。
数据规范分析
N ≤ 10,000。数据比较小。
题目保证所有数字小于 10^4。也就意味着最大的数据为9999,哪么各位数和4*9=36。最小的数据为0,各位数和为0。
因此数据统计方法有两种:1、使用STL的map来统计;2、自己开一个数组来统计。
坑点
就是输出的要求吧。且行末不得有多余空格。在PAT自己的平台会判断这个问题,大部分OJ是忽略最后空格。
AC代码
//1064 朋友数
//https://pintia.cn/problem-sets/994805260223102976/problems/994805267416334336
#include <cstdio>
#include <map>
int main() {
//freopen("1.in", "r", stdin);
//freopen("1.out", "w", stdout);
int n;
scanf("%d", &n);
int i;
int data;
int tmp;
std::map<int, int> ans;
for (i=0; i<n; i++) {
scanf("%d", &data);
tmp = 0;
while (data!=0) {
tmp += data%10;
data /= 10;
}
ans[tmp]++;
}
printf("%d\n", ans.size());
std::map<int, int>::iterator it;
for (it=ans.begin(); it!=ans.end(); it++) {
if (it==ans.begin()) {
printf("%d", it->first);
} else {
printf(" %d", it->first);
}
}
printf("\n");
//fclose(stdin);
//fclose(stdout);
return 0;
}
吐槽一下,这个题目出的不好,因为数据量越大,输出的结果越趋向一样。其实输出数据分布更好。