routing

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);
		}