int nextUnit(int u) {
// implement u * 10 using addition.
int unit = u + u + u;
return unit + unit + unit + u;
}
int digitSum(int x) {
int units[24] = {0};
units[0] = 1;
int column = 0;
while (units[column] < x) {
column++;
units[column] = nextUnit(units[column - 1]);
}
int sum = 0;
while (x > 0) {
if (x >= units[column]) {
x -= units[column];
sum++;
} else {
column--;
}
}
return sum;
}
int isDivBy9(int x)
{
if (x == 0) {
return x == 0;
}
if (x < 0) {
x = -x;
}
int sum = digitSum(x);
if (sum < 10) {
return sum == 9;
}
return isDivBy9(sum);
}
int main() {
for (int i=-10000; i < 1000000; ++i) {
if (isDivBy9(i) != (i%9 == 0)) {
return 1;
}
}
return 0;
}
aW50IG5leHRVbml0KGludCB1KSB7CiAgICAvLyBpbXBsZW1lbnQgdSAqIDEwIHVzaW5nIGFkZGl0aW9uLgogICAgaW50IHVuaXQgPSB1ICsgdSArIHU7CiAgICByZXR1cm4gdW5pdCArIHVuaXQgKyB1bml0ICsgdTsgCn0KCmludCBkaWdpdFN1bShpbnQgeCkgewogICAgaW50IHVuaXRzWzI0XSA9IHswfTsKICAgIHVuaXRzWzBdID0gMTsKICAgIGludCBjb2x1bW4gPSAwOwoKICAgIHdoaWxlICh1bml0c1tjb2x1bW5dIDwgeCkgewogICAgICAgIGNvbHVtbisrOwogICAgICAgIHVuaXRzW2NvbHVtbl0gPSBuZXh0VW5pdCh1bml0c1tjb2x1bW4gLSAxXSk7CiAgICB9CgogICAgaW50IHN1bSA9IDA7CiAgICB3aGlsZSAoeCA+IDApIHsKICAgICAgICBpZiAoeCA+PSB1bml0c1tjb2x1bW5dKSB7CiAgICAgICAgICAgIHggLT0gdW5pdHNbY29sdW1uXTsKICAgICAgICAgICAgc3VtKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY29sdW1uLS07CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHN1bTsKfQoKaW50IGlzRGl2Qnk5KGludCB4KQp7CiAgICBpZiAoeCA9PSAwKSB7CiAgICAgICAgcmV0dXJuIHggPT0gMDsKICAgIH0KICAgIGlmICh4IDwgMCkgewogICAgICAgIHggPSAteDsKICAgIH0KCiAgICBpbnQgc3VtID0gZGlnaXRTdW0oeCk7CgogICAgaWYgKHN1bSA8IDEwKSB7CiAgICAgICAgcmV0dXJuIHN1bSA9PSA5OwogICAgfQoKICAgIHJldHVybiBpc0RpdkJ5OShzdW0pOwoKfQoKaW50IG1haW4oKSB7CiAgICBmb3IgKGludCBpPS0xMDAwMDsgaSA8IDEwMDAwMDA7ICsraSkgewogICAgICAgIGlmIChpc0RpdkJ5OShpKSAhPSAoaSU5ID09IDApKSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9Cg==