/* main.cc ******************* * Author: Thomas Karpiniec * Last Modified: 16 Dec 2005 */ #include void numberCycle(int totalNum, int currentNum, double* selectFrom, double* addTo); void operatorCycle(int totalNum, int currentNum, int* addTo, double* numbers); void orderCycle(int totalNum, int currentNum, double* numbers, int* operators, int* order); int main(int nArgs, char* pszArgs[]) { double numbers[4] = {1.0,3.0,4.0,6.0}; numberCycle(4,1,numbers,NULL); return 0; } void numberCycle(int totalNum, int currentNum, double* selectFrom, double* addTo) { if (addTo == NULL) addTo = new double[totalNum]; for (int i = 0; i < (totalNum-currentNum + 1); i++) { addTo[currentNum - 1] = selectFrom[i]; if (totalNum - currentNum == 0) { std::cout << addTo[0] << addTo[1] << addTo[2] << addTo[3] << std::endl; // AddTo now points to an array of integers - pass it off. operatorCycle(3, 1, NULL, addTo); } else { double newSelectFrom[totalNum]; for (int j = 0; j < totalNum; j++) newSelectFrom[j] = selectFrom[j]; newSelectFrom[i] = newSelectFrom[totalNum-currentNum]; numberCycle(totalNum, currentNum + 1, newSelectFrom, addTo); } } } void operatorCycle(int totalNum, int currentNum, int* addTo, double* numbers) { if (addTo == NULL) addTo = new int[totalNum]; for (int i = 0; i < 4; i++) { addTo[currentNum-1] = i; if (currentNum == totalNum) { std::cout << addTo[0] << addTo[1] << addTo[2] << std::endl; // AddTo now points to an array of operators represented as integers // Grab it and the existing "numbers" array, and pass it off orderCycle(3,1,numbers,addTo,NULL); } else { operatorCycle(totalNum, currentNum + 1, addTo, numbers); } } } void orderCycle(int totalNum, int currentNum, double* numbers, int* operators, int* addTo) { if (addTo == NULL) addTo = new int[totalNum]; for (int i = 0; i < (totalNum - currentNum + 1); i++) { double current; switch (operators[currentNum - 1]) { case 0: current = (double)(numbers[currentNum + i] + numbers[currentNum - 1 + i]); break; case 1: current = (double)(numbers[currentNum + i] - numbers[currentNum - 1 + i]); break; case 2: current = (double)(numbers[currentNum + i] * numbers[currentNum - 1 + i]); break; case 3: current = (double)(numbers[currentNum + i] / numbers[currentNum - 1 + i]); break; default: current = 0; } double newNumbers[totalNum + 1]; int newOperators[totalNum]; for (int j = 0; j < (totalNum + 1); j++) { newNumbers[j] = numbers[j]; newOperators[j] = operators[i]; } newNumbers[currentNum - 1] = current; for (int j = i; j < (totalNum - 1); j++) { newNumbers[j] = newNumbers[j+1]; newOperators[j] = newOperators[j+1]; } addTo[currentNum - 1] = i; orderCycle(totalNum, currentNum + 1, newNumbers, newOperators, addTo); } } void displayResult() { }