一种常规的解体思路,可以避免题目出得不周全而出现的bug
题目描述
数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数
然后输入成对的index和value值,以空格隔开
输出描述:
输出合并后的键值对(多行)
示例1
输入:
4
0 1
0 2
1 2
3 4
输出:
0 3
1 2
3 4
#include <stdio.h> #include <stdlib.h> #include <malloc.h> struct tab { int index; int value; }; int main(void) { int i,j,tab_num, k; struct tab tmp, *p; //输入的数据量 scanf("%d",&tab_num); //存放输入数据 p = malloc(sizeof(struct tab) * tab_num); if(!p) { printf("没有足够的内存使用"); return -1; } //记录输入数据并合并相同的索引 for(i = 0,k = 0; i < tab_num; i++) { scanf("%d%d", &tmp.index, &tmp.value); if (i == 0) { p[0].value = tmp.value; p[0].index = tmp.index; k++; } else { for(j = 0; j < k; j++) { if(p[j].index == tmp.index) { //相同的索引合并 p[j].value += tmp.value; break; } } if(j >= k) { //不同的添加的后面 p[k].value = tmp.value; p[k].index = tmp.index; k++; //记录使用的结构体数组的下标 } } } //排序 for(i = 0; i < k; i ++) { tmp = p[i]; for(j = i + 1; j < k; j++) { if( p[j].index < p[i].index) { //只要比i位置的小,则进行交换 tmp = p[j]; p[j] = p[i]; p[i] = tmp; } } } //输出 for(i = 0; i < k; i++) { printf("%d %d\n",p[i].index, p[i].value); } //用完释放申请的内存 free(p); return 0; }