数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
思路1:用结构体保存key 和对应的value
/*************************************************************************
> File Name: e10.c
> Author: LNM
> Mail: liunenming@gmail.com
> Created Time: 2018年08月25日 星期六 22时59分12秒
>function:数据表记录包含表索引和数值,请对表索引相同的记录进行合并,
即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
************************************************************************/
#include<stdio.h>
typedef struct kandv{
int key;
int value;
} kandv;
void dataproc(int);
int main()
{
int n;
scanf("%d",&n);
kandv arra[n],temp;
int i,j,k;
for(i = 0;i < n;i ++)
{
scanf("%d %d",&arra[i].key,&arra[i].value);
//printf("%d %d\n",arra[i].key,arra[i].value);
}
//合并key值相同的记录
for(i = 0;i < n;i ++)
{
for(j = i + 1;j < n;j ++)
{
if(arra[i].key == arra[j].key)
{
arra[i].value += arra[j].value;
for(k = j + 1;k < n;k ++)
arra[k-1] = arra[k];
j--;
n--;
}
}
}
//简单的冒泡排序
for(i = 0;i < n - 1;i ++)
{
for(j = 0;j < n - 1 - i;j ++)
{
if(arra[j].key > arra[j+1].key)
{
temp = arra[j+1];
arra[j+1] = arra[j];
arra[j] = temp;
}
}
}
for(i = 0;i < n;i ++)
printf("%d %d\n",arra[i].key,arra[i].value);
}
思路2:可以考虑用大数组直接存储,将索引作为数组下标,将索引相同的值加到数组上,但有个问题,即假设value相加后要大于0。
/*************************************************************************
> File Name: e11.c
> Author: LNM
> Mail: liunenming@gmail.com
> Created Time: 2018年08月28日 星期二 22时08分07秒
>function:数据表记录包含表索引和数值,请对表索引相同的记录进行合并,
即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
************************************************************************/
#include<stdio.h>
int main()
{
int ind[5000] = {0};
int val[5000] = {0};
int data[5000] = {0};
int n,i;
scanf("%d",&n);
for(i = 0;i < n;i ++)
scanf("%d %d",&ind[i],&val[i]);
for(i = 0;i < n;i ++)
data[ind[i]] += val[i];
for(i = 0;i < n;i ++)
{
if(data[i] > 0)
printf("%d %d\n",i,data[i]);
}
return 0;
}