1064. 朋友数(20)
如果两个整数各位数字的和是一样的,则被称为是“朋友数”,而那个公共的和就是它们的“朋友证号”。例如123和51就是朋友数,因为1+2+3 = 5+1 = 6,而6就是它们的朋友证号。给定一些整数,要求你统计一下它们中有多少个不同的朋友证号。注意:我们默认一个整数自己是自己的朋友。
输入格式:
输入第一行给出正整数N。随后一行给出N个正整数,数字间以空格分隔。题目保证所有数字小于104。
输出格式:
首先第一行输出给定数字中不同的朋友证号的个数;随后一行按递增顺序输出这些朋友证号,数字间隔一个空格,且行末不得有多余空格。
输入样例:
8 123 899 51 998 27 33 36 12
输出样例:
4 3 6 9 26
题解:注释很清楚,用的方法比较麻烦,浪费很多空间,有空再次完善;
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 int cmp(const void*a, const void*b) 5 { 6 return *(int*)a -*(int*)b; 7 } 8 9 int main() 10 { 11 int N; 12 scanf("%d",&N); 13 int arr[N]; 14 int num[N]; 15 //读入数据,并将每个数据的各位之和存储在数组num[]中 16 for(int i=0; i<N; i++) 17 { 18 scanf("%d",&arr[i]); 19 int tmp=arr[i]; 20 int sum = 0; 21 while(tmp) 22 { 23 sum+=(tmp%10); 24 tmp/=10; 25 } 26 num[i] = sum;//num数组存储朋友证号 27 } 28 // printf("%d\n",num[7]); 29 int cnt=0;//cnt为朋友数计数器 30 int brr[10000]; 31 int final[N]; 32 memset(final,0,sizeof(final)); 33 for(int i=0; i<N; i++) 34 { 35 brr[num[i]] = 0; 36 } 37 for(int i=0; i<N-1; i++) 38 { 39 if(brr[num[i]]) 40 continue; 41 for(int j=i+1; j<N; j++) 42 { 43 if(brr[num[j]]) 44 continue; 45 if(num[i] == num[j]) 46 { 47 brr[num[j]] = 1; 48 final[cnt++] = num[i]; 49 } 50 } 51 } 52 //单独证书自己的朋友数统计 53 for(int i=0; i<N; i++) 54 { 55 if(!brr[num[i]]) 56 final[cnt++] = num[i]; 57 } 58 //排序 59 qsort(final,cnt,sizeof(int),cmp); 60 //输出相异朋友证号总数 61 printf("%d\n",cnt); 62 //输出升序排列的朋友数 63 for(int i=0; i<cnt; i++) 64 { 65 if(i!=cnt-1) 66 printf("%d ",final[i]); 67 else 68 printf("%d",final[i]); 69 } 70 71 72 return 0; 73 }