跳到主要内容

上下取整问题

代码实现

上取整

double a = 6.4;
double b = 1.3;

int fxxk(double a, double b) {
return (a / b - (int)(a / b) > 0.0) ? (int)(a / b) + 1 : (int)(a / b);
}

// 求 a / b 上取整
int res = fxxk(a, b);
C++

下取整

int res = a / b; // 直接除即可
C++

上取整转化为下取整

因为在一般的程序语言中, 整数相除, 结果是一个 下取整 后的整数.

如果使用上取整函数ceil(), 但是在C++中, 它的返回值是一个浮点数, 涉及到浮点计算, 对性能有损耗.

所以有以下公式 km=k1m+1\left\lceil\frac{k}{m}\right\rceil=\left\lfloor\frac{k-1}{m}\right\rfloor+1

此处我们需要讨论一下 km\frac{k}{m} 是否可以被整除

  1. 如果 km\frac{k}{m} 可以 被整除

    • 那么有 k1m\frac{k-1}{m} 一定 不能 被整除

      • km=km=k1m+1\frac{k}{m}=\left\lceil\frac{k}{m}\right\rceil=\left\lfloor\frac{k-1}{m}\right\rfloor + 1
  2. 如果 km\frac{k}{m} 不可以 被整除

    • 那么有 k1m<k1m<km 且有 kmk1m<1\left\lfloor\frac{k-1}{m}\right\rfloor < \frac{k-1}{m} < \frac{k}{m} \ 且有 \ \frac{k}{m} - \left\lfloor\frac{k-1}{m}\right\rfloor < 1

      • km=k1m+1\left\lceil\frac{k}{m}\right\rceil = \left\lfloor\frac{k-1}{m}\right\rfloor + 1

证毕!

附加有相关应用的题目: (实际使用的时候直接采用代数法即可, 具体可以见下面, 有写)

请作者喝奶茶:
Alipay IconQR Code
Alipay IconQR Code
本文遵循 CC CC 4.0 BY-SA 版权协议, 转载请标明出处
Loading Comments...