题目:1064 朋友数 (20 分)
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如 123 和 51 就是朋友数,因为 1+2+3 = 5+1 = 6,而 6 就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。
输入格式:
输入第一行给出正整数 N。随后一行给出 N 个正整数,数字间以空格分隔。题目保证所有数字小于 1。
输出格式:
首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格。
输入样例:
8 123 899 51 998 27 33 36 12
输出样例:
4 3 6 9 26
思路:
- 做一个标记数组cnt【40】判断朋友证号是否出现过,最大的朋友证号应是9999组成的数,个位数和为36,所以开40保险。
- 开另一个记录朋友证号的数组fid【40】。若当前计算的朋友证号没有出现过,那就加入fid数组。全部判定完毕后,将fid数组按升序排序后输出。中间记得算朋友证号的个数,注意同样的朋友证号不重复记录。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <cctype> 4 #include <iostream> 5 #include <sstream> 6 #include <cmath> 7 #include <algorithm> 8 #include <string> 9 #include <stack> 10 #include <queue> 11 #include <vector> 12 #include <map> 13 using namespace std; 14 15 int main() 16 { 17 int n, num; 18 int cnt[40], fid[40]; 19 memset(cnt, 0, sizeof(cnt)); 20 memset(fid, 0, sizeof(fid)); 21 scanf("%d", &n); 22 int ans = 0; 23 while(n--) 24 { 25 scanf("%d", &num); 26 int sum = 0; 27 while(num > 0) 28 { 29 sum += num % 10; 30 num /= 10; 31 } 32 if(cnt[sum] == 0) 33 { 34 cnt[sum]++; 35 fid[ans++] = sum; 36 } 37 } 38 sort(fid, fid + ans); 39 printf("%d\n", ans); 40 for(int i = 0; i < ans; i++) 41 { 42 printf("%d", fid[i]); 43 if(i != ans-1) 44 printf(" "); 45 } 46 return 0; 47 }
总结:
简单题,照题目要求做就行,但因我个人的不熟练,还是考虑了好一会。就是纠结在是否要做个标记数组,想来想去想不出比这更好的办法就只能这样了。
- 遇到重复不计入的题,可考虑做标记,至于标记怎么做,看具体情况再安排。