这题有的条件没给清楚。。数字范围应该是小于等于1000,组数是小于等于100(调bug调了俩小时发现是hash数组的列应该赋1001而我赋了1000!!!)
思路:用一个二维数组来存储每一组中某一数字的个数。行标作为组号,列标为数字,值为次数。
#include<stdio.h> #include<string.h> int main() { int m,n; scanf("%d",&m); while(m--) { int hash[100][1001]; memset(hash,-1,sizeof(hash)); // 初始设-1以便后面确定哪一组是合法的 scanf("%d",&n); int num[n]; // 存储读入的n个数字 int flag[1001] ={0}; // 标记哪些数字出现过 int group,numcnt = 0; // numcnt为不同的数字个数 for(int i = 0;i<n;i++) { scanf("%d",&num[i]); if(!flag[num[i]]) // flag设1 { flag[num[i]] = 1; numcnt ++; // 不同数字个数加1 } } int max = 0; // 最大组号(由于不确定组号是顺序从1到n还是怎样) for(int i = 0;i<n;i++) //读组号并更新hash { scanf("%d",&group); if(hash[group][0] == -1) // 令这一行为合法的(设0) for(int j = 0;j<1001;j++) hash[group][j] = 0; hash[group][num[i]] ++; // 对应的group行,num[i]列加1 if(group > max) // 找出最大组号 max = group; } for(int i = 0;i<=max;i++) // 从0开始到最大组号遍历hash { if(hash[i][0] != -1) // 当且仅当组号合法时再输出 { int cnt2 = 0; // 用于找出flag为1的数字 printf("%d={", i); for (int j = 0; j < numcnt; j++) // 每一组的大括号里面就numcnt个数字 { while (!flag[cnt2++]); // 找出当前flag为1的数字 if (j != numcnt - 1) printf("%d=%d,", cnt2 - 1, hash[i][cnt2 - 1]); else printf("%d=%d", cnt2 - 1, hash[i][cnt2 - 1]); } printf("}\n"); } } } return 0; }