有多种方法。最简单的很明显:
int isdivby3(int n) {
if (n < 0) n = -n;
while (n > 0) n -= 3;
return n == 0;
}
但我们可以改进它。任何数字都可以这样表示:(“,”表示包含范围):
Base2 (AKA binary)
(0,1) + 2*(0,1) + 4*(0,1)
Base4
(0,3) + 4*(0,3) + 16*(0,3)
BaseN
(0,N-1) + N*(0,N-1) + N*N*(0,N-1)
现在的诀窍是,当且仅当基数 n 中的 x 的数字和可被 n-1 整除时,数字 x 可以被 n-1 整除。这个技巧以 9 闻名:
1926 = 6 + 2*10 + 9*100 + 1*1000
6+2+9+1 = 8 + 1*10
8+1 = 9 thus 1926 is divisible by 9
现在我们也可以在 base4 中将其应用于 3。很幸运,因为 4 是 2 的幂,我们可以进行二进制位运算。我使用符号number(base)。
27(10) = 123(4)
Digitsum
12(4)
Digitsum again
3(4) = Divisible!
现在让我们把它翻译成 C:
int div3(int n) {
if (n < 0) n = -n;
else if (n == 0) return 1;
while (n > 3) {
int d = 0;
while (n > 0) {
d += n & 3;
n >>= 2;
}
n = d;
}
return n == 3;
}
速度极快。