Есть разные способы.Самое простое довольно очевидно:
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)
Теперь дело в том, что число x
делится на n-1
тогда и только тогда, когда цифра x
в базе n
делится на 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
Теперь мы можем применить это к 3 тоже в base4.И нам повезло, поскольку 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;
}
Сверкающий быстро.