向上取整向下取整探讨

符号
  1. 向下取整符号: ⌊ x ⌋ ⌊x⌋ x,表示小于等于 x x x 的最大的整数。常用于分数,比如分数的向下取整 ⌊ x y ⌋ ⌊\cfrac {x} {y}⌋ yx
  2. 向上取整符号: ⌈ x ⌉ ⌈x⌉ x,与向下取整符号相对,表示大于等于 x x x 的最小的整数。
向上取整

先放结论:左边式子表示 a a a b + 1 b+1 b+1向上取整,右边是取整的算法

c e i l ( a b + 1 ) ceil(\cfrac {a} {b+1}) ceil(b+1a) = a + b b + 1 \cfrac {a+b} {b+1} b+1a+b

  • a a a b + 1 b+1 b+1的整数倍数, a = k ∗ ( b + 1 ) a=k*(b+1) a=k(b+1),可以得到左边=右边
    • 左边 c e i l ( a b + 1 ) ceil(\cfrac {a} {b+1}) ceil(b+1a) = c e i l ( k ∗ ( b + 1 ) b + 1 ) ceil(\cfrac {k*(b+1)} { b+1}) ceil(b+1k(b+1)) = c e i l ( k ) ceil(k) ceil(k) = k k k
    • 右边 a + b b + 1 \cfrac {a+b} {b+1} b+1a+b = k ∗ ( b + 1 ) + b b + 1 \cfrac {k*(b+1)+b} {b+1} b+1k(b+1)+b = k + b b + 1 k+ \cfrac {b} {b+1} k+b+1b = k + 0 k+0 k+0 = k k k
  • a a a除以 b + 1 b+1 b+1还有余数,设余数为 c c c, 即 a = k ∗ ( b + 1 ) + c a=k*(b+1)+c a=k(b+1)+c ,因为这里的 c c c是余数,其范围是$ \sum_{1}^{(b+1)} c $
    • 左边 c e i l ( a b + 1 ) ceil(\cfrac {a} {b+1}) ceil(b+1a) = c e i l ( k ∗ ( b + 1 ) + c b + 1 ) ceil(\cfrac {k*(b+1)+c} {b+1}) ceil(b+1k(b+1)+c) = c e i l ( k + c b + 1 ) ceil(k+\cfrac {c} {b+1}) ceil(k+b+1c) = c e i l ( k + c b + 1 ) ceil(k+\cfrac {c} {b+1}) ceil(k+b+1c) = k + 1 k+1 k+1
      • 因为这里的 c e i l ( c b + 1 ) ceil(\cfrac {c} {b+1}) ceil(b+1c) 其中 c c c b + 1 b+1 b+1小,向上取整的结果是1

上面两种情况下,都是左边=右边

还有一种等价的形式:

c e i l ( a b ) ceil(\cfrac {a} {b}) ceil(ba) = a + b − 1 b \cfrac {a+b-1} {b} ba+b1 ⌈ a b ⌉ ⌈\cfrac {a} {b}⌉ ba = a + b − 1 b \cfrac {a+b-1} {b} ba+b1

范围

x − 1 < ⌊ x ⌋ ≤ x ≤ ⌈ x ⌉ < x + 1 x−1<⌊x⌋≤x≤⌈x⌉<x+1 x1<xxx<x+1

⌈ a b ⌉ ≤ a + b − 1 b ⌈\cfrac {a} {b}⌉≤\cfrac {a+b-1} {b} baba+b1

⌊ a b ⌋ ⌊\cfrac {a} {b}⌋ ba a − ( b − 1 ) b \cfrac {a-(b-1)} {b} ba(b1)

实现
  • 四舍五入: i n t ( a + 1.0 b + 0.5 ) int(\cfrac {a+1.0} {b}+0.5) int(ba+1.0+0.5)
应用
1904.你完成的完整对局数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OVS9TrlC-1624976626204)(D:\Dev\SrcCode\geek-algorithm-leetcode\src\main\leetcode_manuscripts\skill\向上取整向下取整探讨.assets\image-20210629195006290.png)]

class Solution {
  
      public int numberOfRounds(String startTime, String finishTime) {
            int s = transform(startTime), e = transform(finishTime);
            if (s > e) e += 24 * 60;//如果过了凌晨了,需要将e加1天的时间
            s = (s + 14) / 15;//上取整公式
            e /= 15;//下取整
            return s > e ? 0 : e - s;

        }


        private int transform(String s) {//转换当前的时间为分钟计
            String[] arr = s.split(":");
            int h = Integer.parseInt(arr[0]), m = Integer.parseInt(arr[1]);
            return h * 60 + m;
        }
}
Reference
  • 14
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值