如何在恒定时间内完成此操作(我不想从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
可能等于{{1} })。对于一种情况,结果可能不适合32位(c
,a = 2^31
,b = 2^31-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);
}