给定整数值xy,C和C++都返回为商q = x/y的浮点等价的底面.我对一种退回天花板的方法感兴趣.例如,ceil(10/5)=2ceil(11/5)=3.

显而易见的方法包括:

q = x / y;
if (q * y < x) ++q;

这需要额外的比较和乘法;我见过的其他方法(事实上使用过)包括floatdouble.有没有更直接的方法可以避免额外的乘法(或二次除法)和分支,也可以避免转换为浮点数?

推荐答案

对于正数

unsigned int x, y, q;

总而言之...

q = (x + y - 1) / y;

或(避免x+y中的溢出)

q = 1 + ((x - 1) / y); // if x != 0

C++相关问答推荐

漏洞仅出现在FreeBSD上,但在Windows、Linux和MacOS上运行得非常好

为什么已经设置的值在C中被重置为for循环条件中的新值?

C如何显示字符串数组中的第一个字母

了解一些CLIPS原语数据类型

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

正确的TCP/IP数据包 struct

用C++实现余弦函数

For循环中的变量行为不符合预期.[C17]

如何仅使用软件重新初始化STM32微控制器中的USB枚举?

C11/C17标准允许编译器清除复合文字内存吗?

收到不兼容的指针类型警告,因为函数的返回不是空*,而是 struct 指针

如何在VSCode中创建和使用我自己的C库?

使用正则表达式获取字符串中标记的开始和结束

unions 的原子成员是个好主意吗?

如何在Rust中处理C的longjmp情况?

C循环条件内的函数

程序打印一些随机空行

System V 消息队列由于某种原因定期重置

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?

C Makefile - 如何避免重复提及文件名