题目来源:
https://www.luogu.com.cn/problem/B2095
常规题,有两个思路,一个是直接输出数组边遍历求最大最小值,循环结束后直接用sum总和减去最大最小值,然后按题目要求做下去(不知道为嘛我的代码出来结果不一样,但是思路是可以成功的)。第二个就是先排序,直接减少头尾的计算,很暴力的解法就是了。
int main()
{
int n;
scanf("%d",&n);
double a[1000],sum=0;
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
}
//先进行排序,那么第一个和最后一个就是最大和最小,直接舍去
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-1-i;j++)
{
if(a[j]>a[j+1])
{
double tmp=a[j];//冒泡排序
a[j]=a[j+1];
a[j+1]=tmp;
}
}
}
for(int i=1;i<n-1;i++)//1到n-1个数字进行总和
{
sum+=a[i];
}
double avg=sum/(n-2);
printf("%.2lf ",avg);
//误差
double b[1000];//另开了一个数组记录每个误差
int k=0;
for(int i=1;i<n-1;i++)
{
b[k++]=fabs(a[i]-avg);//注意这里是fabs因为是double变量
}
double max_b=b[0];
for(int j=0;j<k;j++)
{
if(max_b<b[j])//找最大
max_b=b[j];
}
printf("%.2lf",max_b);
}