#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n)//输入n个人
char a[200][9];//代表玩家的名字 用二维数组因为前一个代表元素后一个代表输入的名字
int b[200];//代表玩家的数字
double c[200];//代表减去平均值的各个数的绝对值
double sum = 0;//代表这几个数的总和
// 使用 getchar() 读取换行符,以避免影响后续输入
getchar();
for (int i = 0; i < n; i++) {//输入名字和数字
scanf("%s %d", a[i], &b[i]);
sum += b[i];//求出总和
}
sum = sum / n / 2; // 得出平均值
for (int i = 0; i < n; i++) {
c[i] = abs(b[i] - sum);//用来存放平均值的数组
}
int target = 0;//用来作为找到名字数组的目标
double min = c[0];
for (int i = 1; i < n; i++) {
if (min > c[i]) {
min = c[i];
target = i; // 修正为直接赋值 i
}
}
printf("%.0f %s\n", sum, a[target]);//输出整数部分的平均值和目标的名字
return 0;
}
结果出现段错误就是内存过大数组越界异常,这时候就要处理越界异常让内存释放出来
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int n;
scanf("%d", &n);
char** a = malloc(n * sizeof(char*));//同上二维数组代表名字
for (int i = 0; i < n; i++) {
a[i] = malloc(1000 * sizeof(char));
}
int* b = malloc(n * sizeof(int));
double* c = malloc(n * sizeof(double));
double sum = 0;
// 使用 getchar() 读取换行符,以避免影响后续输入
getchar();
for (int i = 0; i < n; i++) {
scanf("%99s %d", a[i], &b[i]); // 限制字符串的长度
sum += b[i];
}
sum = sum / n / 2;
for (int i = 0; i < n; i++) {
c[i] = abs(b[i] - sum);
}
int target = 0;
double min = c[0];
for (int i = 1; i < n; i++) {
if (min > c[i]) {
min = c[i];
target = i;
}
}
printf("%.0f %s", sum, a[target]);
// 释放动态分配的内存
for (int i = 0; i < n; i++) {
free(a[i]);
}
free(a);
free(b);
free(c);
return 0;
}