ceil() 函数笔记(C++算法竞赛向)

📌 基本概念

#include <cmath>  // 必须包含的头文件

double ceil(double x);  // 向上取整
float ceilf(float x);   // float版本
long double ceill(long double x);  // long double版本
  • 功能:返回不小于x的最小整数值(向+∞方向取整)
  • 时间复杂度:O(1)

🚀 典型用法

1. 基本取整

cout << ceil(3.2);   // 输出4
cout << ceil(-2.7);  // 输出-2(注意负数方向)

2. 配合除法使用(竞赛高频)

// 计算a/b的上取整(经典技巧)
int a = 5, b = 2;
int res = (a + b - 1) / b;  // 方法1:整数运算
int res = ceil(a / (double)b);  // 方法2:转为浮点

3. 分数处理

// 计算⌈x/y⌉ * z
double ans = ceil(x / y) * z;

🔧 特殊技巧

1. 避免浮点误差

// 错误示例(浮点精度问题)
double d = 0.1 + 0.1 + 0.1;  // 实际可能是0.30000000000000004
cout << ceil(d * 100);  // 可能输出31

// 解决方案:加微小修正值
const double EPS = 1e-10;
cout << ceil(d * 100 - EPS); 

2. 自定义ceil函数(纯整数版)

// 避免浮点运算的ceil实现
int int_ceil(int a, int b) {
    return (a + b - 1) / b;
}
// 示例:⌈17/5⌉ = 4
cout << int_ceil(17, 5);  

3. 模板化实现

template<typename T>
T safe_ceil(T x) {
    T res = ceil(x);
    if (abs(res - x) < 1e-9) res = round(x); // 处理x.999999情况
    return res;
}

⚠️ 常见坑点

  1. 整数除法陷阱

    int a = 5, b = 2;
    cout << ceil(a / b);  // 输出2!因为先做了整数除法
    cout << ceil(a / (double)b);  // 正确:3.0
    
  2. 负数方向混淆

    cout << ceil(-1.5);  // 输出-1(不是-2!)
    
  3. 浮点精度问题

    cout << ceil(0.1 + 0.2);  // 可能输出1(实际应为0)
    

🏆 竞赛应用场景

1. 分页计算

// 计算n个元素每页显示k个需要多少页
int pages = ceil(n / (double)k);

2. 内存对齐

// 计算需要分配的块数(每块BLOCK_SIZE)
int blocks = ceil(total_size / (double)BLOCK_SIZE);

3. 几何问题

// 计算覆盖区域需要的瓷砖数量
int tiles = ceil(length / tile_size) * ceil(width / tile_size);

💡 性能对比

方法精度速度适用场景
ceil()需要精确浮点结果
(a+b-1)/b纯整数运算
int(x + 0.999)快速近似

📌 竞赛建议:优先使用整数运算实现ceil,仅在必须处理浮点时使用标准库函数

// 推荐模板
#define CEIL(a, b) ((a) + (b) - 1) / (b)  // 仅适用于正整数
### C++ 中 `ceil` 函数的含义和用法 #### 1. 定义 在 C++ 中,`ceil` 函数用于对浮点数向上取整。这意味着,无论小数部分是多少,函数都会返回一个大于或等于输入值的最小整数[^3]。该函数定义在 `<cmath>` 头文件中,支持多种数据类型,包括 `float`、`double` 和 `long double`。 #### 2. 函数原型 以下是 `ceil` 函数的不同重载形式: ```cpp float ceilf(float x); // 参数为 float 类型 double ceil(double x); // 参数为 double 类型 long double ceill(long double x); // 参数为 long double 类型 ``` #### 3. 示例代码 以下是一个完整的示例,展示如何使用 `ceil` 函数: ```cpp #include <iostream> #include <cmath> // 包含头文件以使用 ceil 函数 using namespace std; int main() { float x = 2.3; cout << "ceil(" << x << ") = " << ceil(x) << endl; // 输出:ceil(2.3) = 3 double y = 3.8; cout << "ceil(" << y << ") = " << ceil(y) << endl; // 输出:ceil(3.8) = 4 long double z = -2.9; cout << "ceil(" << z << ") = " << ceil(z) << endl; // 输出:ceil(-2.9) = -2 return 0; } ``` #### 4. 注意事项 - 当输入为负数时,`ceil` 函数会返回比输入值更大的最小整数。例如,`ceil(-2.9)` 的结果是 `-2`,因为 `-2` 是大于 `-2.9` 的最小整数[^5]。 - 如果输入值已经是整数(如 `2.0` 或 `-3.0`),则 `ceil` 函数会直接返回该值。 - 使用 `ceil` 函数时需要注意数据类型的转换。例如,在某些情况下,`1 / alpha` 的结果可能因整数除法而产生误差[^4]。为了避免此类问题,建议将分子显式转换为浮点数,例如 `1.0 / alpha`。 #### 5. 自定义实现 如果需要手动实现 `ceil` 函数,可以参考以下代码逻辑: ```cpp #include <iostream> using namespace std; double customCeil(double x) { if (x > 0 && x - static_cast<int>(x) != 0) { return static_cast<int>(x) + 1; } else { return static_cast<int>(x); } } int main() { double x = 2.3; cout << "customCeil(" << x << ") = " << customCeil(x) << endl; // 输出:customCeil(2.3) = 3 double y = -2.9; cout << "customCeil(" << y << ") = " << customCeil(y) << endl; // 输出:customCeil(-2.9) = -2 return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值