更新,其实不用执着于格式的问题,中位数存在小数,一定就是含有0.5,判断整数是否需要加上0.5就行
ccf201903:小中大
关键点:中位数为分数时保留一位,为整数时不能有小数位。
用%.1g字符(g格式符不输出小数点后无意义的零),零分。
ccf不认%g???
改用setprecision函数,满分。
错误代码:
#include"iostream"
using namespace std;
int main()
{
int n, i;
float mid=0;
cin >> n;
int a[n];
for (i = 0; i < n; i++)
cin >> a[i];
if (n % 2 == 0)
{
mid = (a[(n / 2) - 1] + a[n / 2]) / 2.0;
}
else
{
mid = a[(n - 1) / 2];
}
int max=a[0],min=a[0];
for(i=1;i<n;i++)
{
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
}
cout << max << " ";
printf("%.1g", mid);
cout<<" "<< min<<endl;
return 0;
}
转折后代码:
#include "iostream"
using namespace std;
#include"iomanip"
int main()
{
int n,i,key=1;//key用来控制中位为分数的值,1表示分数
float mid=0;
cin >> n;
int a[n];
for (i = 0; i < n; i++)
cin >> a[i];
if (n % 2 == 0)
{
mid = (a[(n / 2) - 1] + a[n / 2]) / 2.0;
if(mid==(int)mid)
key=0;
}
else
{
mid = a[(n - 1) / 2];
key=0;
}
int max=a[0],min=a[0];
for(i=1;i<n;i++)
{
if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];
}
cout << max << " "<<fixed<<setprecision(key)<<mid<<" "<<min<<endl; //此处key控制了输出格式
return 0;
}