C++ 计算的计算技巧,例如,如果每个盒子可以容纳M个对象,那么放置N个对象所需的盒子数量?

C++ 计算的计算技巧,例如,如果每个盒子可以容纳M个对象,那么放置N个对象所需的盒子数量?,c++,C++,作为最近topcoder SRM问题的一部分,我们必须计算承载“N”人所需的公交车“B”数量,因为每辆公交车都有“S”座位 在C++中最聪明的方法是什么? 显而易见的方法是: if(N%S==0){B=N/S;} else{ B=N/S + 1;} ^所有变量都是整数,N和S分配了适当的值 然而,我无法理解以下代码背后的逻辑,这是我正在签出的一个特定topcoder用户的解决方案 B = (N + (S-1))/S; 这是如何工作的?代码 B = (N + (S-1))/S; 这是一

作为最近topcoder SRM问题的一部分,我们必须计算承载“N”人所需的公交车“B”数量,因为每辆公交车都有“S”座位

<>在C++中最聪明的方法是什么? 显而易见的方法是:

if(N%S==0){B=N/S;}
else{ B=N/S + 1;}
^所有变量都是整数,N和S分配了适当的值

然而,我无法理解以下代码背后的逻辑,这是我正在签出的一个特定topcoder用户的解决方案

   B = (N + (S-1))/S;
这是如何工作的?

代码

B = (N + (S-1))/S;
这是一种常见的取整技巧。我们知道,在整数除法中,余数是截断的,基本上是
floor
所做的。在这种情况下,我们通过首先添加S-1来执行
ceil
操作

这与浮点数四舍五入的常用方法类似:

n = floor(n + 0.5);
代码

B = (N + (S-1))/S;
这是一种常见的取整技巧。我们知道,在整数除法中,余数是截断的,基本上是
floor
所做的。在这种情况下,我们通过首先添加S-1来执行
ceil
操作

这与浮点数四舍五入的常用方法类似:

n = floor(n + 0.5);

用一些测试值(例如S=4,N=4,5,6,7,8)尝试一下,你就会看到它是如何工作的。谢谢,我想我明白了:)…我想你的
if
条件应该是
N%S==0
。至于哪种解决方案更好?很难说。我认为在实践中没有人会注意到这两个性能之间的差异除非它恰好在一些性能关键循环的中间。抱歉,纠正它。因此,它主要适用于您必须快速键入的编码竞赛。此外,我还发现了另一种做同样事情的方法:
B=(N/S)+(N%S!=0)
在加法过程中,RHS上的第二个项将被转换为int。是的,这是一种非常有用且广为人知的四舍五入方法。你有什么问题吗?用一些测试值(例如S=4,N=4,5,6,7,8)试试看,你就会知道它是如何工作的。谢谢,我想我明白了:)…我想你的
if
你的“显而易见”方法的条件应该是
N%S==0
。至于哪种解决方案更好?很难说。我认为在实践中没有人会注意到这两个性能之间的差异除非它恰好在一些性能关键循环的中间。抱歉,纠正它。因此,它主要适用于您必须快速键入的编码竞赛。此外,我还发现了另一种做同样事情的方法:
B=(N/S)+(N%S!=0)
在加法过程中,RHS上的第二个项将被转换为int。是的,这是一种非常有用且广为人知的四舍五入方法。你有问题吗?