在 C++ 中调整整数除法的商

Posted

技术标签:

【中文标题】在 C++ 中调整整数除法的商【英文标题】:Adjusting quotient of integer division in C++ 【发布时间】:2018-12-19 13:54:45 【问题描述】:

示例:B+ 树

给定树中的 N 个元组,每个内部节点最多 di 子节点和每个叶子最多 dl 值,如果我没记错的话,B+ 树的最小高度将是 h = ceil(log_di((N + dl - 1) / dl))。 仅当/ 表示整数除法并且我可以将(N + dl - 1) / dl 替换为static_cast<double>(N) / dl 时才适用。

#include <cmath>
int minHeight(int N)

    constexpr int di = 256;
    constexpr int dl = 255;
    return std::lround(std::ceil(log((N + (dl - 1)) / dl) / log(di)));

我的兴趣在于模式:(N + d - 1) /d。这似乎在计算大于或等于被除数 (N) 的除数 (d) 的最小倍数时使用。

问题

    此模式是否有与之相关的名称?在设计数据结构和算法时有多常见? 如果不常见,是否有另一种方法可以用 C++ 编写此代码以更易于理解?

【问题讨论】:

【参考方案1】:

(N + d - 1) / d 是在 C++ 中编写整数表达式的一种完全正常的方式。该表达式中的所有项都是整数类型,因此特别是除法/ 的分子和分母也是int。因此,C++ 会将/ 用作int 类型的除法运算符。

我不完全确定您在任何一个问题中所问的确切内容。这个“模式”没有我知道的特定名称,但我不确定你为什么认为它应该有一个。这只是一个数学表达式。

至于让它“更容易理解”,这当然是主观的,但是(除了变量没有信息性名称这一事实之外)我觉得它完全可读。如果您正在寻找表达式的代数简化,那么我会警告您不要这样做。例如,虽然(N/d) + (1/d) - 1 在数学上看起来是等价的,但在这种情况下通常不是这样。这主要是因为前面提到的这些是整数除法,但也因为int 类型的精度有限,在某些情况下可能会影响结果(例如整数溢出)。

【讨论】:

我最近在我的项目中多次使用这种模式,并且(作为初学者)发现它很好奇,因此提出了问题。虽然我对a/b 的直觉是指b 完全适合a 的次数,但在这种情况下需要多少b 才能适合a 的问题并不像(a+ (b-1))/b 那样可读。你基本上已经回答了我的问题,谢谢。

以上是关于在 C++ 中调整整数除法的商的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 794.高精度除法

Dhall中的整数除法

剑指offer-001-整数的除法

力扣专题——剑指 Offer II 001. 整数除法

大整数除法表示为 C++ 中的字符串

C++的大数除法最快速度的算法