题目描述
数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数 然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入
4 0 1 0 2 1 2 3 4
输出
0 3 1 2 3 4
#include<iostream>
int main()
{
int Key_Value[10000]={0},Key,Value,Number,i;
std::cin>>Number;
for(i=0;i<Number;i++)
{
std::cin>>Key>>Value;
Key_Value[Key]+=Value;
}
for(i=0;i<10000;i++)
{
if(Key_Value[i]!=0)
std::cout<<i<<" "<<Key_Value[i]<<std::endl;
}
return 0;
}
在看到上面第一个版本的代码中感觉上好像简单快捷,但是会出现bug,这里按照常规进行处理,就是先循环输入数据,然后再进行去重和求和,最后进行排序,然后是最后的结果输出。定义一个结构体类型,类型中有两个成员,一个是index,一个是value,具体程序如下所示:
#include <iostream>
using namespace std;
struct DataForm
{
int index;
int value;
};
int main()
{
int Num,i,j,k;
cin>>Num;
DataForm key[Num];
//int count = Num;
for(i=0;i<Num;i++)
cin>>key[i].index>>key[i].value;
//int max=key[0].index;
for(i=0;i<Num;i++)
{
for(j=i+1;j<Num;j++)
{
if(key[i].index==key[j].index)
{
key[i].value=key[i].value+key[j].value;
for( k=j;k<Num-1;k++)
key[k]=key[k+1];
j--;
Num--;
}
}
}
DataForm Temp;
for (i = 0; i < Num; i++)
{
for (j = 0; j < Num-1-i; j++)
{
if (key[j].index > key[j+1].index)
{
Temp = key[j];
key[j]=key[j+1];
key[j+1]=Temp;
}
}
}
for(i=0;i<Num;i++)
{
cout << key[i].index<<" "<<key[i].value << endl;
}
return 0;
}