Skip to content

Instantly share code, notes, and snippets.

@ales-erjavec
Created January 31, 2019 21:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ales-erjavec/a28597f6dae27c2abc161feddd4c5ffb to your computer and use it in GitHub Desktop.
Save ales-erjavec/a28597f6dae27c2abc161feddd4c5ffb to your computer and use it in GitHub Desktop.
A modulo operator in c
#include <stdio.h>
#include <limits.h>
#include <assert.h>
int mod(int a, int b) {
int res;
if (b < 0) {
// because -INT_MIN == INT_MIN
if (b > INT_MIN) {
return -mod(-a, -b);
} else {
// b == INT_MIN
if (a == INT_MIN) {
return 0;
} else if (a < 0) {
return a;
} else {
return INT_MIN + a;
}
}
}
assert(b > 0);
if (a < 0) {
res = b - 1 - (-(a + 1)) % b;
} else {
res = a % b;
}
assert(res > INT_MIN);
return res;
}
int main (int argc, char** argv)
{
printf("% i mod % i = % i\n", 2, 5, mod(2, 5));
printf("% i mod % i = % i\n", -2, 5, mod(-2, 5));
printf("% i mod % i = % i\n", 2, -5, mod(2, -5));
printf("% i mod % i = % i\n", -2, -5, mod(-2, -5));
printf("% i mod % i = % i\n", 9, 5, mod(9, 5));
printf("% i mod % i = % i\n", -9, 5, mod(-9, 5));
printf("% i mod % i = % i\n", 9, -5, mod(9, -5));
printf("% i mod % i = % i\n", -9, -5, mod(-9, -5));
printf("% i mod % i = % i\n", 10, 5, mod(10, 5));
printf("% i mod % i = % i\n", -10, 5, mod(-10, 5));
printf("% i mod % i = % i\n", 10, -5, mod(10, -5));
printf("% i mod % i = % i\n", -10, -5, mod(-10, -5));
printf("% i mod % i = % i\n", INT_MAX, 5, mod(INT_MAX, 5));
printf("% i mod % i = % i\n", INT_MIN, 5, mod(INT_MIN, 5));
printf("% i mod % i = % i\n", 5, INT_MAX, mod(5, INT_MAX));
printf("% i mod % i = % i\n", 5, INT_MIN, mod(5, INT_MIN));
printf("% i mod % i = % i\n", INT_MAX, INT_MIN, mod(INT_MAX, INT_MIN));
printf("% i mod % i = % i\n", INT_MIN, INT_MAX, mod(INT_MIN, INT_MAX));
printf("% i mod % i = % i\n", INT_MAX - 1, INT_MIN, mod(INT_MAX - 1, INT_MIN));
printf("% i mod % i = % i\n", INT_MIN + 1, INT_MAX, mod(INT_MIN + 1, INT_MAX));
printf("% i mod % i = % i\n", INT_MAX, INT_MIN + 1, mod(INT_MAX, INT_MIN + 1));
printf("% i mod % i = % i\n", INT_MIN, INT_MAX - 1, mod(INT_MIN, INT_MAX - 1));
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment