1064 朋友数 (20 分)

题目: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 }

 

总结:

  简单题,照题目要求做就行,但因我个人的不熟练,还是考虑了好一会。就是纠结在是否要做个标记数组,想来想去想不出比这更好的办法就只能这样了。

  • 遇到重复不计入的题,可考虑做标记,至于标记怎么做,看具体情况再安排。
posted @ 2019-08-30 16:22  Anzer  阅读(423)  评论(0编辑  收藏  举报