Monday, August 15, 2011

Problem 43

prob43.cc Problem 43
Filename: prob43.cc
// Prob 43
#include <stdio.h>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>

using namespace std;

typedef long long unsigned int LLUINT;
typedef unsigned int UINT;

LLUINT toLLUINT(const string &num)
{
	LLUINT x;
	istringstream(num) >> x;
	return x;
}

string toString(UINT n)
{
	string s;
	stringstream out;
	out << n;
	s = out.str();

	if(s.length() == 2)
		{
			s.insert(0, "0");
		}

	return s;
}

UINT nextNum(UINT first_digit, const string &working_pandigital_number)
{
	string fd = toString(first_digit);
	string new_pd = fd+working_pandigital_number;
	UINT numb;
	istringstream(new_pd.substr(0, 3)) >> numb;
	return numb;
}

bool isSuitable(UINT n, const string &working_pandigital_number)
{
	string running_working_pandigital_number_copy(working_pandigital_number);
	const string s = toString(n);
	const int original_length = running_working_pandigital_number_copy.length();
	
	for(string::const_iterator it=s.begin(); it!=s.end(); ++it)
		{
			running_working_pandigital_number_copy.push_back(*it);
		}

	sort(running_working_pandigital_number_copy.begin(), running_working_pandigital_number_copy.end());
	string::iterator new_end = unique(running_working_pandigital_number_copy.begin(), running_working_pandigital_number_copy.end());
	
	running_working_pandigital_number_copy.erase(new_end, running_working_pandigital_number_copy.end());

	return running_working_pandigital_number_copy.length() == (original_length + s.length());
}

string addLastDigit(const string &num)
{
	string digits="0123456789";

	for(string::const_iterator i = num.begin();
		i!=num.end();
		++i)
		{
			for(string::iterator j = digits.begin();
				j!=digits.end();
				++j)
				{
					if(*j==*i)
						{
							digits.erase(j);
							break;
						}
				}
		}

	string new_num(num);
	new_num.insert(0, digits);
	return new_num;
}

void outputPandigitals(const vector<string> &wp)
{
	printf("######################\n");
	for(vector<string>::const_iterator working_pandigital_number=wp.begin();
		working_pandigital_number!=wp.end();
		++working_pandigital_number)
		{
			printf("\t%s\n", (*working_pandigital_number).c_str());
		}
}

int main()
{
	vector<string> working_pandigitals;
	vector<UINT> divisors;
	divisors.push_back(13);
	divisors.push_back(11);
	divisors.push_back(7);
	divisors.push_back(5);
	divisors.push_back(3);
	divisors.push_back(2);

	for(UINT i=17; i < 1000; i+=17)
		{
			string working_pandigital_number("");
			if(isSuitable(i, working_pandigital_number))
				{	
					const string s17(toString(i));
					for(string::const_iterator it = s17.begin(); it != s17.end(); ++it)
						{
							working_pandigital_number.push_back(*it);
						}
					working_pandigitals.push_back(working_pandigital_number);
				}
		}

	for(vector<UINT>::const_iterator divisor=divisors.begin(); divisor!=divisors.end(); ++divisor)
		{
			vector<string> new_working_pandigitals;
			for(vector<string>::const_iterator working_pandigital_number=working_pandigitals.begin(); 
				working_pandigital_number!=working_pandigitals.end(); 
				++working_pandigital_number)
				{
					for(UINT i=0; i<10; ++i)
						{
							string temp_working_pandigital_number(*working_pandigital_number);
							UINT new_num = nextNum(i, temp_working_pandigital_number);
							//							printf("i: %d nn: %d divisor: %d\n", i, new_num, *divisor);
							if((new_num%(*divisor) == 0) && isSuitable(i, temp_working_pandigital_number))
								{
									//									printf("\t\tbefore twpn: %s\n", temp_working_pandigital_number.c_str());
									temp_working_pandigital_number.insert(0, toString(i));
									//									printf("\t\tafter  twpn: %s\n", temp_working_pandigital_number.c_str());
									new_working_pandigitals.push_back(temp_working_pandigital_number);
								}
						}
				}
			working_pandigitals = new_working_pandigitals;
		}

	LLUINT result(0);
	for(vector<string>::const_iterator working_pandigital_number=working_pandigitals.begin();
		working_pandigital_number!=working_pandigitals.end();
		++working_pandigital_number)
		{
			result += toLLUINT(addLastDigit(*working_pandigital_number));
		}


	printf("answer: %llu\n", result);
}


syntax highlighted by Code2HTML, v. 0.9.1

No comments:

Post a Comment