讨论个简单的整除问题
问题很简单, 就是把一个总的数目n进行分割, 能分成几块.
这个是大家平时常遇到的吧, 之前面试也正好见过这样一道小题呢. 来提一下吧~
假设总数为n, 每块的大小为split, 则block_num = ?
我一般就是block_num = (0 == n % split) ? (n / split) : (n / split + 1);
有没有更高效的方法? 总觉得我这种求法是不是有点费劲...
[解决办法]
block_num = (n + split - 1)/split;
[解决办法]
block_num=(n-1)/split+1
最后一块可能比前面的小
[解决办法]
我#7楼讲的ceil floor就是数学上的概念
而你的问题本质就是ceil
floor到ceil 就是+1 - eps
eps是一个足够小的数 当然你这里split为底
最小精度 (float)1/split 就够用了而已
ceil = (float)n/split + 1 - (float)1/split
再化简 使能直接使用整数相除
就是
ceil=(n-1)/split+1 这个才是本质
(n + split-1)/split 这个才是变形
例 n + split-1 >int_max && n<int_max 时
“(n + split-1)/split”就溢出了
而“(n-1)/split+1”没有溢出
[解决办法]
ceil = floor(fval+1-eps)
floor = ceil(fval + eps - 1)
round = floor(fval +0.5)
round = ceil(fval -0.5+eps)
floor = round(fval - 0.5)
ceil = round(fval + 0.5 - eps)