void do_bf(unsigned long sum, unsigned long mult, void (*callback)(unsigned char, unsigned char, unsigned char, unsigned char)) { int a, b, c, d; unsigned long s0, s1, s2, s3; unsigned long m0, m1, m2, m3; s0 = 0; m0 = 1; for (a=0 ; a<256 ; a++) { s1 = s0 + a; m1 = m0 * a; for (b=0 ; b<256 ; b++) { s2 = s1 + b; m2 = m1 * b; for (c=0 ; c<256 ; c++) { s3 = s2 + c; m3 = m2 * c; d = sum - s3; if (d > 255) continue; if (m3 * d == mult) callback(a, b, c, d); } } } } #ifndef BFLIB #include #include #include #define chr(x) (((x) < 0x7f) && ((x) >= 0x20) ? x : '.') void mycb(unsigned char a, unsigned char b, unsigned char c, unsigned char d) { if ((d >= c) && (c >= b) && (b >= a)) printf("Solution: %x (%c) %x (%c) %x (%c) %x (%c)\n", a, chr(a), b, chr(b), c, chr(c), d, chr(d)); } int main(int argc, char **argv) { unsigned long sum, mult; unsigned char *ptr; if (argc < 2) _exit(1); ptr = argv[1]; while (*ptr != '-') ptr++; sum = 0; while (*++ptr != '-') { sum *= 10; sum += *ptr - '0'; } mult = 0; while (*++ptr != '-') { mult *= 10; mult += *ptr - '0'; } do_bf(sum, mult, mycb); return 0; } #endif