【问题标题】:O(1) code to count multiples of a number in a range?O(1)代码来计算范围内数字的倍数?
【发布时间】:2013-05-02 22:09:45
【问题描述】:

我如何在恒定时间内做到这一点(我不想从 a 到 b 迭代)?

// return number of multiples of c in [a,b]
long count_multiples(int a, int b, int c) {
   assert(b >= a && c != 0);
   // todo
   return -1;
}

这个问题看起来很简单,但比看起来更难,因为它有一些极端情况,例如必须处理所有情况(a,b 可以是负数/零,c 也可以是负数,a 可能等于 b 可能等于 c)。结果可能不适合 32 位的一种情况(a = 2^31b = 2^31-1c = 1 or -1

【问题讨论】:

    标签: c math integer 32-bit division


    【解决方案1】:
    long count_multiples(int a, int b, int c) {
        if (b < a) return 0;
        if (c < 0) c = -c;
        long al = a, bl = b, cl = c;
        if (c == 1) return bl - al + 1;
        return ((bl + (b < 0 ? 1 : 0)) / cl) -
               ((al - (a > 0 ? 1 : 0)) / cl) +
               ((a <= 0 && b >= 0) ? 1 : 0);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2019-06-25
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多