O(1)代码计算范围内数字的倍数?

时间:2013-05-02 22:09:45

标签: c math integer 32-bit division

如何在恒定时间内完成此操作(我不想从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;
}

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

1 个答案:

答案 0 :(得分: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);
}