Dlouhá aritmetika je nejjednodušší v základu 10000.
/***** ========== LONG ARITHMETICS ========== *****/ /* num *= x (x is "one digit", i.e., x < 10000) */ void mul (bignum_t* num, int x) { int i, c = 0; for ( i = MAXDIGS; --i >= num->beg; ) { num->dig[i] = num->dig[i] * x + c; c = num->dig[i] / BASE; num->dig[i] %= BASE; } if ( c > 0 && num->beg > 0 ) num->dig[--num->beg] = c; } /* num /= x (x is "one digit", i.e., x < 10000) */ void div (bignum_t* num, int x) { int i, c = 0; for ( i = num->beg; i < MAXDIGS; ++i ) { num->dig[i] += c * BASE; c = num->dig[i] % x; num->dig[i] /= x; } if ( num->beg < MAXDIGS-1 && num->dig[num->beg] == 0 ) ++num->beg; }
/* shortest path */ if ( x < y ) { d = (x+y) / 2; c = x; } else { d = x; c = (x-y) / 2; } if ( c == 0 || c == d ) printf ("There is " LPAR "1" RPAR " route of the shortest length " LPAR "%d" RPAR ".\n", d); else { /* comb(d,c) = d! / c! / (d-c)! */ printf ("There are " LPAR); one (&num); for ( i = 1; i <= d; ++i ) mul (&num, i); for ( i = 1; i <= c; ++i ) div (&num, i); for ( i = 1; i <= d-c; ++i ) div (&num, i); print (&num); printf (RPAR " routes of the shortest length " LPAR "%d" RPAR".\n", d); }