浮点数排序
我们有 N 个正浮点数,均小于 10000.0。现在需要将这些浮点数按照离它最近的整数的差从小到大排序,浮点数与距离最近的整数的差越小,这个浮点数的排位越靠前;如果差相等,按照浮点数的值从小到大排序。
判断浮点数相等应该使用如下语句:
if (fabs(a - b) < EPSILON) {
//执行当两个浮点数 a 和 b 相等时的操作
}
其中 EPSILON
为常量,大小为 10^{-6}。
输入格式
输入有 2 行
- 第一行为一个整数 N,0 < N < 101;
- 第二行为用空格隔开的 N 个正浮点数,均小于 10000.0。
输出格式
输出有 1 行,为按照题目要求排序后的 N 个正浮点数,四舍五入保留 6 位小数,用空格隔开。
样例输入复制
9
1.001 2.1 3.2 4.0001 5.000001 6.9 7.2 8.001 9.0
样例输出复制
9.000000 5.000001 4.000100 1.001000 8.001000 2.100000 6.900000 3.200000 7.200000
代码:
主要是要注意一个浮点数与整数的差有两种情况,一种向下取整的整数,一种向上取整的整数
#include <iostream>
#include<algorithm>
#include<cmath>
#define EPSILON 1e-6
using namespace std;
int n;
double num[105];
bool cmp(double a, double b) {
//判断a、b到向上取整的数和向下取整的数的差,取最小的
double x_a = a - (int)a; //到向下取整的那个数的差
double xx_a = abs(a - (int)a - 1); //到向上取整的差
double s_a = min(x_a, xx_a);
double x_b = b - (int)b;
double xx_b = abs(b - (int)b - 1);
double s_b = min(x_b, xx_b);
if(fabs(s_a - s_b) < EPSILON){//差相等,按浮点数从小到大
return a < b;
}
return s_a < s_b;
}
int main() {
cin>>n;
for(int i = 0; i <= n; i++){
cin>>num[i];
}
sort(num, num + n, cmp);
for(int i = 0; i < n; i++){
if(i < n - 1)
printf("%.6lf ", num[i]);
else
printf("%.6lf\n", num[i]);
}
return 0;
}