sort排序实战 ——浮点数排序

浮点数排序

我们有 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;
}

猜你喜欢

转载自blog.csdn.net/qq_40663810/article/details/88598539