#include #include #include #define MAX_DIGITS_PER_VAL 3 #define NUM_STR_SIZE (MAX_DIGITS_PER_VAL + 1) static int *vals, numVals, minVal, maxVal, count, show; static char (*numStrTab)[NUM_STR_SIZE]; static void genNumStrTab(void) { numStrTab = malloc((maxVal-minVal+1)*NUM_STR_SIZE); char buf[5]; for (int i=minVal; i<=maxVal; i++) { sprintf(buf, "%*d", NUM_STR_SIZE, i); memcpy(numStrTab[i-minVal], buf, NUM_STR_SIZE); } } static void printVals(void) { static char line[1000]; char *p = line; for (int i=0; i< numVals; i++) { memcpy(p, numStrTab[vals[i]-minVal], NUM_STR_SIZE); p += NUM_STR_SIZE; } puts(line); } static void list1(int lowerLimit, int upperLimit, int index) { int start = minVal; if (start < lowerLimit) start = lowerLimit; if (index) { int end = maxVal; if (end > upperLimit) end = upperLimit; for (int val = start; val<=end; val++) { vals[index] = val; list1(lowerLimit+maxVal-val, upperLimit+minVal-val, index-1); } } else { vals[0] = start; count++; if (show) printVals(); } } static void list(int targetSum) { count = 0; list1(targetSum-(numVals-1)*maxVal, targetSum-(numVals-1)*minVal, numVals-1); fprintf(stderr, "%d Kombinationen gefunden\n", count); } int main(int argc, char *argv[]) { numVals = strtol(argv[1], NULL, 10); minVal = strtol(argv[2], NULL, 10); maxVal = strtol(argv[3], NULL, 10); const int targetSum = strtol(argv[4], NULL, 10); show = argc < 6 || !strchr(argv[5], 'o'); genNumStrTab(); vals = malloc(numVals*sizeof(int)); list(targetSum); return 0; }