CCF认证201903-1小中大

CCF认证201903-1小中大

题目描述

201903-1小中大

算法设计+题目分析

吐槽一下
题目不是很难,但是用VC6.0会出现一些bug(推测就是这个ide的问题),问题如下CCF认证201903-1小中大
槽点如图,都是按照整型输出-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;
}

感谢链接

CCF认证201903-1小中大CCF认证201903-1小中大 simon_liu123 发布了3 篇原创文章 · 获赞 0 · 访问量 44 私信 关注
上一篇:CSP-201903-2-二十四点


下一篇:【回顾】Spark项目工程搭建