All pastes #41578 Raw Edit

Mine

public text v1 · immutable
#41578 ·published 2006-02-14 13:00 UTC
rendered paste body
/* main.cc
*******************
* Author: Thomas Karpiniec
* Last Modified: 16 Dec 2005
*/

#include <iostream>

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* selectFrom);
int calculate(int totalNum, int currentNum, double* numbers, int* operators, int* order);

int main(int nArgs, char* pszArgs[])
{
	double numbers[4] = {24.0,7.0,8.0,11.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 < (totalNum + 1); 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,NULL);
		}
		else
		{
			operatorCycle(totalNum, currentNum + 1, addTo, numbers);
		}
	}
}



void orderCycle(int totalNum, int currentNum, double* numbers, int* operators, int* order, int* selectFrom)
{
	if (order == NULL)
		order = new int[totalNum];
	if (selectFrom == NULL)
	{
		selectFrom = new int[totalNum];
		for (int i = 0; i < totalNum; i++)
			selectFrom[i] = i;
	}
	for (int i = 0; i < (totalNum - currentNum + 1); i++)
	{
		order[currentNum - 1] = selectFrom[i];
		if (currentNum == totalNum)
		{
			std::cout << "No. ";
			for (int k = 0; k < 4; k++)
				std::cout << numbers[k] << " ";
			std::cout << "Op. ";
			for (int k = 0; k < 3; k++)
				std::cout << operators[k] << " ";
			std::cout << "Or. ";
			for (int k = 0; k < 3; k++)
				std::cout << order[k] << " ";
			std::cout << std::endl;
			if (calculate(4,1,numbers,operators,order) == 1)
				std::cout << "FOUND ONE" << std::endl;
		}
		else
		{
			int newSelectFrom[totalNum];
			for (int j = 0; j < totalNum; j++)
				newSelectFrom[j] = selectFrom[j];
			newSelectFrom[i] = selectFrom[totalNum-currentNum];
			orderCycle(totalNum, currentNum + 1, numbers, operators, order, newSelectFrom);
		}
	}
}

int calculate(int totalNum, int currentNum, double* numbers, int* operators, int* order)
{
	if (totalNum > currentNum - 1)
	{
		double newNumbers[totalNum - currentNum];
		int newOperators[totalNum - currentNum - 1];
		int newOrder[totalNum - currentNum - 1];
		int minimumIndex = 0;
		for (int i = 0; i < (totalNum - currentNum + 1); i++)
			if (order[i] < order[minimumIndex])
				minimumIndex = i;
		double result = 0.0;
		switch(operators[minimumIndex])
		{
			case 0:
				result = numbers[minimumIndex] + numbers[minimumIndex + 1];
				break;
			case 1:
				result = numbers[minimumIndex] - numbers[minimumIndex + 1];
				break;
			case 2:
				result = numbers[minimumIndex] * numbers[minimumIndex + 1];
				break;
			case 3:
				result = numbers[minimumIndex] / numbers[minimumIndex + 1];
				break;
		}
		int fillPoint = 0;
		for (int i = 0; i < minimumIndex; i++)
			newNumbers[fillPoint++] = numbers[i];
		newNumbers[fillPoint++] = result;
		for (int i = minimumIndex+2; i < totalNum - currentNum; i++)
			newNumbers[fillPoint++] = numbers[i];
		fillPoint = 0;
		for (int i = 0; i < minimumIndex; i++)
		{
			newOperators[fillPoint] = operators[i];
			newOrder[fillPoint++] = order[i];
		}
		for (int i = minimumIndex + 1; i < totalNum - 1; i++)
		{
			newOperators[fillPoint] = operators[i];
			newOrder[fillPoint++] = order[i];
		}
		if (calculate(totalNum, currentNum + 1, newNumbers, newOperators, newOrder) == 1)
			return 1;
		else
			return 0;
	}
	else
	{
		if (numbers[0] == 24.0)
			return 1;
		else
			return 0;
	}
}