#include #include #include #define MAX_BASE 32 /* Recursive function for locating digit-counting numbers: A[0...idx-1] stores the digits placed so far, A[idx...base-1] is filled with zeros, B[] stores the digit counts for A[0...base-1], sum stores the sum of the digits in A[]. */ void find ( int A[], int B[], int idx, int sum, int base ) { int i, d, found; d = 0; if (sum == base) idx = base; /* The remaining digits must be zero */ else if (idx == base-2) { /* A[base-1] = 0 so put the remaining sum at A[base-2] */ d = base - sum; A[idx] = d; ++B[d]; --B[0]; idx = base; } if (idx == base) { /* Construction of A[] is complete */ found = 1; for (i=0; i 0 */ /* Put A[idx] = 0 and recurse */ findfast(A,B,idx+1,sum,base,twoused); /* Put A[idx] = 1 and recurse */ if ((sum < base) && (B[1] < 2)) { A[idx] = 1; ++B[1]; --B[0]; findfast(A,B,idx+1,sum+1,base,(B[1]==2)); --B[1]; ++B[0]; } /* Put A[idx] = 2 and recurse */ if ((!twoused) && (sum <= base-2) && (B[2] < 2)) { A[idx] = 2; ++B[2]; --B[0]; findfast(A,B,idx+1,sum+2,base,1); --B[2]; ++B[0]; } A[idx] = 0; } } int main () { int A[MAX_BASE], B[MAX_BASE], i, base; clock_t t1, t2; printf("\n+++ Method 1: Uses the observations:\n"); printf(" (a) A[0] != 0\n"); printf(" (b) A[0] + A[1] + A[2] + ... + A[base-1] = base\n"); printf(" (c) A[base-1] = 0\n"); printf("\n Hit enter when ready...\n"); getchar(); t1 = clock(); for (base=2; base<=16; ++base) { printf("base = %2d:", base); fflush(stdout); A[0] = 0; B[0] = base; for (i=1; i