CCF认证201903-1小中大
题目描述
算法设计+题目分析
吐槽一下
题目不是很难,但是用VC6.0会出现一些bug(推测就是这个ide的问题),问题如下
槽点如图,都是按照整型输出-1,竟然会出现两个不同的值,真的困惑了我半天。。。
算法设计+题目分析
1、维护一个num[100010]的数组;
2、按照整型输入n个有序整数;
3、根据头尾确定最大值和最小值,仍然保存为整型;
4、根据n模2的值是否为0,即n是个偶数还是奇数,奇数转5,偶数转6;
5、直接打印最大值、中间值、最小值,结束;
6、偶数时,将中间2个数相加,除以2.0,根据加和的结果是偶数还是奇数决定输出的中位数小数位数,偶数输出0位小数,奇数输出1位小数。
几个核心点
1、当把一个整数运算赋给一个double时要注意加.0
mid=(num[n/2-1]+num[n/2])/2.0;//这里如果除以2,就只有80分
2、C语言默认的保留小数位数的操作就是四舍五入,不需要自己规定
double mid;
printf("%.1f ", mid)
3、判断中位数是否为整数时,可以用它之前的加和是否能被2整除来判断
if ((num[n/2-1]+num[n/2])%2==0) printf("%.0f ", mid);
注意点+记录点
1、scanf和printf的数据格式一定要对应,涉及到数据存储大小
const int MAX=100010;
int num[MAX];
scanf("%d", &num[i]);//因为num数组是整型,此处必须整型输入
double mid;
printf("%.0f ", mid);//此处必须浮点数输出
代码(100分)
环境
Visual C++6.0
#include <stdio.h>
const int MAX=100010;
int num[MAX];
int main(){
int n;
scanf("%d", &n);
for (int i=0; i<n; i++){
scanf("%d", &num[i]);
}
double mid;
int max, min;
if (num[0]>num[n-1]){
max=num[0];
min=num[n-1];
}
else{
max=num[n-1];
min=num[0];
}
if (n%2==0){
mid=(num[n/2-1]+num[n/2])/2.0;//此处必须2.0
printf("%d ", max);
if ((num[n/2-1]+num[n/2])%2==0) printf("%.0f ", mid);//保留0位小数,相当于整型
else printf("%.1f ", mid);//保留1位
printf("%d", min);
}
else{
printf("%d %d ", max, num[(n-1)/2]);
printf("%d", min);
//printf("%d %d %d", max, mid, -1);//这个是一个ide的bug点,与cin.getline蕾丝
}
return 0;
}