CCF 201903-1 小中大 C++ 精度、类型转换问题注意!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二刷:关键在于想要得到double类型的mid,就要除以2.0而不是2.
mid=(a[n/2-1]+a[n/2])/2.0;或者mid=double((a[n/2-1]+a[n/2]))/2;
注意,已经是排好序的,只是不确定升序还是降序,所以不用重新排序,只要判断一下最大最小的有没有反。
注意:输出时,%.1f对应double类型的mid,%d对应整型的mid1,用mid是不行的。类型和输出格式一定要对应,否则扣很多分。 强制转换类型int mid1=int(mid);

#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
	int n,min,max;
	double mid;
	scanf("%d",&n);
	int a[n];
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	if(n%2!=0)  mid=a[n/2];
	else   mid=(a[n/2-1]+a[n/2])/2.0;
	int mid1=int(mid);
	min=a[0];
	max=a[n-1];
	if(min>max) swap(min,max);	
	if(mid!=mid1)
	   printf("%d %.1f %d",max,mid,min);
	else 
	   printf("%d %d %d",max,mid1,min);
	return 0;
}

一刷:
思路:读取n,如果n%2==1,说明有奇数个数,中位数为第n/2向上取整个数(n/2+1);如果有偶数个数,则中位数为第n/2和n/2+1个数加和再除以2;定义三个变量分别存储最大值、最小值和中位数,最大值和最小值通过保留第一个和最后一个数并且比较大小来确定。输出中位数前要判断是否带小数,如果n为奇数,则中位数肯定是整数,如果n是偶数,则**要看中间的两个数相加得到的是奇数还是偶数,如果是偶数,则除以2得到的中位数必然是整数,如果和是奇数,则得到的是小数,**需要四舍五入输出一位小数。其实,由于相加的两个是整数,除以2之后最多只有一位小数,所以不必考虑四舍五入。

#include <iostream>
#include <algorithm>
//#include <iomanip>
using namespace std;
int main()
{
	int n,min,max;	
	cin >> n;
	int a[n];
	for(int i=0;i<n;i++)
	{
		cin >> a[i];
	}
	max=a[0];
	min=a[n-1];
	if(max<min) swap(min,max);
	cout << max << " ";
	if(n%2==1) cout <<a[n/2]<< " ";
	else{
		if((a[n/2-1]+a[n/2])%2!=0) 
		{
//			//cout << setiosflags(ios::fixed);
			cout << (a[n/2-1]+a[n/2])/2.0 << " ";
		}
		else
		   cout << (a[n/2-1]+a[n/2])/2 << " ";
	}
	cout << min << endl;
	return 0;
}

注意int型到double型的转换方法double(a)即可,其中a为int型。 本题目由于是整数相加再相除最多一位小数,所以不必设置精度。

总结:
int mid1=int(mid); 强制转换mid从double到int
想要得到double类型的mid,由于a[n]是int型,为了不丢失小数点后的精度
mid=(a[n/2-1]+a[n/2])/2.0;或者mid=double((a[n/2-1]+a[n/2]))/2;`
scanf("%d",&n);
printf("%d %.1f %d",max,mid,min); printf("%.2f", 3.1415);输出几位小数
printf("%d %d %d",max,mid1,min);类型与格式对应
Int是将一个数值向下取整为最接近的整数的函数。
两个类型的数值可以相互赋值,int赋给double型,会自动补零,反之会截断只保存整数部分。

cout输出精度用于浮点数输出,包括float和double类型。
要控制输出精度,需要引用头文件iomanip, 并使用setiosflags(ios::fixed);配合setprecision。
使用方法见示例代码:

#include<iostream>
#include<iomanip>
using namespace std;
 
int main()
{
    double f = 3.1415926535;
    cout << f << endl;           // 3.14159
    cout <<setiosflags(ios::fixed);  //只有在这项设置后,setprecision才是设置小数的位数。
    cout << setprecision(0) << f << endl;    //输出0位小数,3
    cout << setprecision(1) << f << endl;    //输出1位小数,3.1
    cout << setprecision(2) << f << endl;    //输出2位小数,3.14
    cout << setprecision(3) << f << endl;    //输出3位小数,3.142
    cout << setprecision(4) << f << endl;    //输出4位小数,3.1416
    return 0;
}

cout默认是不输出浮点数小数点后多余的0的。如果想要输出小数点后多余的0,则要在程序中用cout.setf(ios::showpoint);语句设置,不再想输出时要用cout.unsetf(ios::showpoint);语句恢复。
printf("%f",mid);默认输出小数点后六位,且0不省略。
%8.3f。就是:占8个字符的位置,小数点后面有3位。注意小数点也算一位。
测试数据:

3
-1 2 4

4
-2 -1 3 4

4
-1 2 3 4
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值