小中大
一、题目描述
试题链接:http://118.190.20.162/view.page?gpid=T89
二、题目分析
- 时间,内存限制小,数据范围小,简单排序获得最大最小,中位数(处于序列中间位置的数)
-
认真读题,注意题目输出要求,中位数是小数保留一位小数,中位数是整数直接输出,并且最大值,最小值一定是整型,直接输出,
cout<<fixed<<setprecision(1)<<mid <<min,这种控制精度连续输出会导致min也受保留小数位的影响,要分开输出 - 整型中位数和小数中位数要分开,
不能统一定义为int类型中位数-------------无法保留一位小数
不能统一定义为double类型中位数-------------有精度误差,输出会出错
问题:
在C++中,我们会将double、float类型转换成int型,准确的说,将double、float类型取整,会出现以下问题:
double dTemp1=1.0000;
double dTemp2=5.0000;
int iTemp1=(int)dTemp1;
int iTemp2=(int)dTemp2;
结果
iTemp1=0; //dTemp1是1.00000,但是实际很可能是0.999999,当然截取整数部分,就成了0
iTemp2=4; //dTemp1是5.00000,但是实际很可能是4.999999,当然截取整数部分,就成了4
如果统一声明double类型中位数,当中位数为整数时cout输出会先将double类型转换为int类型,此时输出就会因为精度误差导致答案错误
三、AC代码
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 10000000
int n;
int num[MAXSIZE];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
int max,min; //整型数组,最大最小值一定为整数
double mid_d=0; //分数型中位数
int mid_i=0; //整数型中位数
sort(num,num+n);
max=num[n-1];
min=num[0];
int t=0;
if(n%2) //奇数个
mid_i=num[(n-1)/2];
else
{
int a=num[(n-1)/2];
int b=num[(n+1)/2];
t=a+b;
if(t%2) mid_d=t/2.0; //计算过程中有一个为double类型,结果就为double类型
else mid_i=t/2;
}
if(t%2)
{
cout<<max<<" "<<fixed<<setprecision(1)<<mid_d<<" ";
}
else
{
cout<<max<<" "<<mid_i<<" ";
}
cout<<min;
return 0;
}
其实我们也观察到了,中位数要么是整数,要么就小数位为.5,所以也可以抓住这点,直接对中位数输出进行处理
#include<bits/stdc++.h>
using namespace std;
#define MAXSIZE 10000000
int n;
int num[MAXSIZE];
int main()
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>num[i];
}
int max,min;
int mid=0;
sort(num,num+n);
max=num[n-1];
min=num[0];
int t=0;
if(n%2) //奇数个
mid=num[(n-1)/2];
else
{
int a=num[(n-1)/2];
int b=num[(n+1)/2];
t=a+b;
mid=t/2;
}
if(t%2)
{
cout<<max<<" "<<mid<<".5 ";
}
else
{
cout<<max<<" "<<mid<<" ";
}
cout<<min;
return 0;
}
四、心得体会
- 做题前先读题,看清题目要求,分析数据范围,输入输出要求,时间限制,内存限制
- 尽量不要double、int混用,不必要情况不进行他俩的转换,很容易出错,cout输出会默认将小数转化为整数输出