数据表记录包含表索引index和数值value(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照index值升序进行输出。
提示:
0 <= index <= 11111111
1 <= value <= 100000
先输入键值对的个数n(1 <= n <= 500)
接下来n行每行输入成对的index和value值,以空格隔开
输出合并后的键值对(多行)
4 0 1 0 2 1 2 3 4
0 3 1 2 3 4
3 0 1 0 2 8 9
0 3 8 9
#define CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //功能:打印二维数组 void print_2D_array(int kv[][2], int rows) { int i = 0; for (i = 0; i < rows; i++) { printf("%d %d\n", kv[i][0], kv[i][1]); } } /* * @brief:删除二维数组里第二列是0的行。 * @note:行数肯定会减少,所以要使用指针更新原rows。 */ void proc_del_zero(int kv[][2], int* rows) { int i = 0, new_rows = 0; for (i = 0; i < *rows; i++) { if (kv[i][1] != 0) { kv[new_rows][1] = kv[i][1]; kv[new_rows][0] = kv[i][0]; new_rows++; } } *rows = new_rows; } /* * @brief:将相同索引的数值进行求和运算 * @param:**kv:待处理的二维数组 * @param:rows:待处理的二维数组的行数,也是键值对的个数 * @retval:NONE * @note:第0列是key,第1列是value。 */ void proc_sum(int kv[][2], int rows) { int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = i + 1; j < rows; j++) { if (kv[i][0] == kv[j][0]) { kv[i][1] += kv[j][1]; //求和 kv[j][1] = 0; //被加过的元素置零,防止多次被加。 } } } } /* * @brief:按照key值升序排列二维数组 * @param:kv[][2]:待处理的二维数组 * @param:rows:待处理的二维数组的行数,也是键值对的个数 * @retval:NONE * @note:第0列是key,第1列是value。本次使用选择排序算法。 */ void proc_upsort(int kv[][2], int rows) { // 检查数组是否有元素 if (rows <= 0) return; int i = 0, j = 0; int min = 0; int temp[1][2] = {0}; for (i = 0; i < rows; i++) { min = i; for (j = i + 1; j < rows; j++) { if (kv[min][0] > kv[j][0]) { min = j; //拿到最小key值对应的行数字 } } //交换kv[i]行的数据和kv[min]行的数据 temp[0][0] = kv[i][0]; temp[0][1] = kv[i][1]; kv[i][0] = kv[min][0]; kv[i][1] = kv[min][1]; kv[min][0] = temp[0][0]; kv[min][1] = temp[0][1]; } } int main() { int couples = 0; //键值对的个数,也是二维数组的行数。 int key_value[501][2] = {0}; //根据题目,做多500行2列,第一列键,第二列值。 int i = 0; scanf("%d", &couples); if (couples < 1 || couples > 500) //键值对的个数必须1 <= n <= 500 exit(-1); for (i = 0; i < couples; i++) { //循环输入键值对 scanf("%d %d", &key_value[i][0], &key_value[i][1]); if (key_value[i][0] < 0 || key_value[i][0] > 11111111) exit(-1); //必须 0 <= index <= 11111111 if (key_value[i][1] < 1 || key_value[i][1] > 100000) exit(-1); //必须 1 <= value <= 100000 } proc_sum(key_value, couples); //键相同的行,对值求和,求完和的行把其value清零。 proc_del_zero(key_value, &couples); //删除二维数组里第二列是0的行 proc_upsort(key_value, couples); //做完前面的步骤后,把每一行按照key的值升序 print_2D_array(key_value, couples); //打印二维数组 return 0; }
#include "stdio.h" #include "string.h" #include <ctype.h> //思路:分成三个部分,求和,排序,输出。注意测试用例里给的数据是乱序所以必须排序。 //这个代码有一个问题,就是循环相加的部分只能处理index只有两个相同的部分,三个及以上就会漏,不知道怎么回事和怎么补救,还好例子里最多三个,因此用了两遍就过了。 void upper_bubble_sort_for_IA(int index[], int value[],int n) { int i,j,tempv,tempi; for(i = 0; i <n; i++) { for(j = 0; j < n - 1- i; j++) { if(index[j] > index[j+1]) { tempv = value[j]; value[j] = value[j+1]; value[j+1] = tempv; tempi = index[j]; index[j] = index[j+1]; index[j+1] = tempi; } } } } int main() { //输入部分 int n,i,a; //struct IA inva; scanf("%d",&n); int index[500] = {0},value[500] = {0}; for(i = 0; i < n; i++) { scanf("%d",&index[i]); scanf(" %d", &value[i]); } //比较并求和部分 for (i = 0; i < n; i++) { for(a = 1; a < n - 1 -i; a++) { if(index[i] == index[i+a]&& value[i+a] !=0) { value[i] = value[i] + value[i+a]; value[i+a] = 0; } } } //排序 upper_bubble_sort_for_IA(index,value,n); for (i = 0; i < n; i++) { for(a = 1; a < n -i; a++) { if(index[i] == index[i+a]&& value[i+a] !=0) { value[i] = value[i] + value[i+a]; value[i+a] = 0; //a = 1; //i = 0; } } } //输出 for(i = 0; i < n; i++) { if (value[i] !=0) { printf("%d %d\n",index[i],value[i]); } } }
#include <stdio.h> int main() { int count=0,vari=0,i=0,j=0,index=0; scanf("%d",&count); long int a[500][2],b[500][2]; for(i=0;i<count;i++) { scanf("%ld %ld",&a[i][0],&a[i][1]); } for(i=0;i<count;i++){ for(j=0;j<count;j++){ if(a[i][0]==b[j][0]) break; } if(j>=vari) { index = vari; b[index][0] = a[i][0]; b[index][1] = a[i][1]; vari++; }else{ index = j; b[index][1] = b[index][1]+a[i][1]; } } long int temp[2]; for(i=0;i<vari-1;i++){ for(j=0;j<vari-1-i;j++){ if(b[j][0]>b[j+1][0]){ temp[0] = b[j][0]; temp[1] = b[j][1]; b[j][0] = b[j+1][0]; b[j][1] = b[j+1][1]; b[j+1][0] = temp[0]; b[j+1][1] = temp[1]; } } } for(j=0;j<vari;j++){ printf("%ld %ld\n",b[j][0],b[j][1]); } return 0; }
#include <stdio.h> int main() { int index[501]={-1}, value[501]={-1},i,j,n,temp1,temp2; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d %d",&index[i],&value[i]); } for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(index[i]==index[j]) { value[i]=value[i]+value[j]; index[j]=-1; } } } for(i=0;i<n-1;i++) { for(j=0;j<n-1;j++) { if(index[j]>index[j+1]) { temp1=index[j]; temp2=value[j]; index[j]=index[j+1]; value[j]=value[j+1]; index[j+1]=temp1; value[j+1]=temp2; } } } for(i=0;i<n;i++) { if(index[i]>=0) printf("%d %d\n",index[i],value[i]); } return 0; }
#include <stdio.h> #include <stdlib.h> int main() { unsigned int line_num,temp_key,temp_valu,curr_value,curr_key = 0; scanf("%d",&line_num); while(line_num --){ scanf("\n%u%u",&temp_key,&temp_valu); if(curr_key < temp_key){ printf("%d %d\n",curr_key,curr_value); curr_key = temp_key; curr_value = 0; } curr_value += temp_valu; } printf("%d %d\n",curr_key,curr_value); }
#include <stdio.h> int HashTable[11111112] = {0}; int main() { int Num = 0; scanf("%d",&Num); int IndexTemp = 0,ValueTemp = 0; for(int i = 0;i< Num;i++) { IndexTemp = 0,ValueTemp = 0; scanf("%d %d",&IndexTemp,&ValueTemp); if(HashTable[IndexTemp] == 0) { HashTable[IndexTemp] = ValueTemp; }else { HashTable[IndexTemp] += ValueTemp; } } for(int j = 0;j < 11111112;j++) { if(HashTable[j] != 0) { printf("%d %d\r\n",j,HashTable[j]); } } return 0; }
//用二维数组,过程也只是平常思路 #include <stdio.h> int main() { int n, inx, val; scanf("%d", &n); int arr[n][2]; for (int i = 0; i < n; i++) { scanf("%d %d", &arr[i][0], &arr[i][1]); } for (int i = n - 1; i > 0; i--) { for (int j = n - 2; j >= 0; j--) { if (i != j) { if (arr[i][0] == arr[j][0]) { arr[i][1] += arr[j][1]; arr[j][0] = 0; arr[j][1] = 0; } } } } for (int j = 0; j < n; j++) { for (int i = 0; i < n - j - 1; i++) { if (arr[i][0] > arr[i + 1][0]) { inx = arr[i][0]; val = arr[i][1]; arr[i][0] = arr[i + 1][0]; arr[i][1] = arr[i + 1][1]; arr[i + 1][0] = inx; arr[i + 1][1] = val; } } } for (int i = 0; i < n; i++) { if (arr[i][0] != 0 || arr[i][1] != 0) { printf("%d %d\n", arr[i][0], arr[i][1]); } } return 0; }
#include <stdio.h> int main() { int a, b; struct data{ int index; int value; }temp; struct data D[501]; int n; int i = 0, j = 0;//j代表当前存到了第几个数字+1(未存); int m = 0, v = 0; scanf("%d",&n); for (; i<n; i++) { int cun = 0; scanf("%d %d",&m,&v); for(int k=0; k<j; k++){ if(D[k].index == m){ D[k].value += v; cun = 1; } } if(cun == 0){ D[j].index = m; D[j].value = v; j++; } } for(i = 0; i<j-1; i++){ //开始排序并输出 for (m = i+1; m<j; m++) { if(D[i].index>D[m].index){ temp = D[i]; D[i] = D[m]; D[m] = temp; } } printf("%d %d\n",D[i].index,D[i].value); } printf("%d %d\n",D[i].index,D[i].value); return 0; }
#include <stdio.h> int main() { long index, value, str[500][500]={0}, num[500][500]={0}; int i, j, n; scanf("%d ",&n); i=0; while(i<n) { scanf("%ld %ld", &str[i][0], &str[i][1]); i++; } int count=0; for(i=0;i<n;i++) //合并 { for(j=0;j<count;j++) { if(str[i][0]==num[j][0]) { num[j][1]+=str[i][1]; break; } } if(j==count) //index值首次出现直接赋值 { num[count][0]=str[i][0]; num[count][1]=str[i][1]; count++; } } for(i=0;i<count;i++) //排序 { for(j=i+1;j<count;j++) { if(num[i][0]>num[j][0]) { int temp0=num[i][0]; int temp1=num[i][1]; num[i][0]=num[j][0]; num[i][1]=num[j][1]; num[j][0]=temp0; num[j][1]=temp1; } } } for(i=0;i<count;i++) { printf("%ld %ld\n",num[i][0],num[i][1]); } return 0; }
#include <stdio.h> #include <stdbool.h> //index和value用结构体存放 typedef struct record{ int ndx; int val; }record; //冒泡排序 void Sort(record *L, int n){ int i, j; for(i=0; i<n-1; i++){ bool flag = false; for(j=n-1; j>i; j--) if(L[j-1].ndx > L[j].ndx){ /*swap*/ record temp = L[j-1]; L[j-1] = L[j]; L[j] = temp; flag = true; } if(flag == false) break; } } int main(){ /*输入n*/ int n; scanf("%d", &n); /*循环n次,输入数据*/ record L[n]; int i; for(i=0; i<n; i++) scanf("%d %d", &L[i].ndx, &L[i].val); /*排序*/ Sort(L, n); /*遍历,如果下一格index等于当前,累加*/ int sum = 0; for(i=0; i<n; i++){ if(L[i+1].ndx == L[i].ndx && i+1 < n) sum += L[i].val; else{ sum += L[i].val; printf("%d %d\n", L[i].ndx, sum); sum = 0; } } return 0; }