Take advantage that mod 3 and mod 11 can easily be chained one digit at a time.
#include<stdio.h>
#include<ctype.h>
void mod3_11(void) {
int mod3 = 0;
int mod11 = 0;
int ch;
while (isdigit(ch = fgetc(stdin))) {
int digit = ch - '0';
mod3 = (digit + mod3)%3;
mod11 = (digit - mod11 + 11)%11;
}
printf("mod 3 = %d\n", mod3);
printf("mod 11 = %d\n", mod11);
fflush(stdout);
}
int main(void) {
mod3_11();
return 0;
}
This works as each successive digit is processed, code is taking the previous "mod" * 10
// math
mod_n <-- (10*mod_n + digit)%n
mod3 <-- (mod3*10 + digit) % 3
mod3 <-- (mod3*1 + mod3*3*3 + digit) % 3
mod3 <-- (mod3 + 0 + digit) % 3 (mod3*3*3 % 3 is 0)
mod3 <-- (mod3 + digit) % 3
mod11 <-- (mod11*10 + digit) % 11
mod11 <-- (mod11*11 - mod11*1 + digit) % 11
mod11 <-- (mod11*11 - mod11 + digit + 11) % 11 (add 11 to avoid negative numbers)
mod11 <-- (-mod11 + digit + 11) % 11
Why add 11? What's the difference between “mod” and “remainder”?