这题有的条件没给清楚。。数字范围应该是小于等于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;
}

京公网安备 11010502036488号