正整数相除的向上取整算法(巧妙思维设计)

正整数相除的向上取整算法(巧妙思维设计) - 知乎

大家好:

今天我来和大家讨论一个相对简单的问题-----整数(正)相除的向上取整算法;

案例1): 一个青蛙跳跃一次的步长为3,现在它垂直于马路方向要跳跃整条马路。假定马路的款为---x长? 问:它最少需要跳跃几次能够完全跳过这条马路?

案例2) : 一个房间可以住6个人,现在来了一群人 人数为 x 。 问最少需要多少个房间才能让这x个人都可以住下? 假设一个房间住满的情况下,才安排另外一个房间。

案例3) : 假设我们在页面浏览数据时,一个页面最多能够显示20条数据,现在通过查询,得到的数据量为x,问需要多少页才能够将这x项数据都呈现出来?

我想大家都已经明白这几个问题的需求了? 看起来非常简单的逻辑;

问题1)----假设马路的长度是10,青蛙一次跳3,跳3次的距离是9 ,4次的距离是12;为了能完全跳过马路,需要跳跃4次;=====》10/3+1=4

如果马路的长度是12=====》12/3=4

如果马路的长度是13=====》13/3+1=5 需要5次才能完全过去;

问题2) 问题3) 都是同样的道理! 相信很多朋友已经找到了解决此类问题的答案:

结果result= x%n==0 ? x/n : x/n +1; (n为每一步的长度)?

经典的三目运算完全可以解决此类问题! 但今天我想给大家介绍一个针对此类问题较为巧妙的算法公式: ========》 result=(x+n-1)/n ;

why? 分子是总量加上步长减去1 ,运算后的结果再去除以步长。

我们要明白计算机中的整数运算是向下取整的,也就是如果能整除,没有余数,那结果正好是得到的答案; 如果不能整除,有余数,就将余数舍弃,保留相除后的整数部分。但此时正好 和我们想要得到的结果(向上取整)相差一个。

我们再回头看看计算公式的分子部分-------(x+n-1) =====(x+(n-1)) , n-1 比除数n 就小1 。(n-1)/n 等于0 但是一旦有一个非零的正整数 与n-1 相加 器结果必然不是0 至少是1; 此时正好与x/n 取余数相结合,x/n的余数范围在 0 ~(n-1)之间,其与n-1相加 范围就是(n-1)~(2n-1)之间 如果n是大于0的整数 , 一个(n-1)~(2n-1)的数与n相除,其结果必然是0 或1 且只有在x是n的整倍数的情况下以上结果才能为0;

经过分析,x如果是n的整倍数,(x+n-1)/n 的结果就是x/n 如果不是(有余数)(x+n-1)/n===》x/n +1 ; 所以公式: result=(x+n-1)/n ; 完全可以表示来个整数相除(x>=n的情况) 结果向上取整; 

总结:

x为整数, n为步长, 即有如下表达:

x = m * n + i;

则:

i = 0时, 即x可被m整除, (x + n - 1)/n  ===> ((m * n + 0) + n - 1)/n ===>  (m*n)/n + (n-1)/n ===> m

i >= 1且i < n时, 即x不可以被m整除, (x + n - 1)/n  ===> ((m * n + i) + n - 1)/n ===>  (m * n)/n + (n + ( i-1))/n ===> m + 1 + (i -1)/n ===> m + 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值