// For simplicity of letters, this will only convert bases between 2 and 36.

#include <iostream.h>
#include <math.h>
#include <ctype.h>
#include <conio.h>
#include "apstring.h"

void main()
{
	long cbase, fbase, base10=0;
	apstring cnum, fnum;
	bool error=0;

	clrscr();

	cout << "Base Converter v1.0 - Jeff Chien" << endl;
	cout << "Converts integers with bases between 2 and 36, inclusive" << endl << endl;

	cout << "Number to be converted:  ";
	cin >> cnum;
	cout << "Number's current base:   ";
	cin >> cbase;
	cout << "Base to be converted to: ";
	cin >> fbase;
	cout << endl;

	// Converts number into base 10
	for(int a=cnum.length()-1;a>=0;a--)
		if(cnum[a] >= '0' && cnum[a] <='9')
			if(cnum[a] - '0' >= cbase)
			{
				cout << "Error - Invalid number in " << pow(cbase,cnum.length()-1-a) << "'s digit: " << cnum[a] << " max digit = ";
				if(cbase-1<10)
					cout << cbase-1;
				else
					cout << char(cbase-1-10+'A');
				cout << endl;
				error=true;
			}
			else
				base10 += (cnum[a] - '0') * pow(cbase,cnum.length()-1-a);

		else if(toupper(cnum[a]) >= 'A' && toupper(cnum[a]) <= 'Z')
			if(toupper(cnum[a]) - 'A' + 10 >= cbase)
			{
				cout << "Error - Invalid number in " << pow(cbase,cnum.length()-1-a) << "'s digit: " << cnum[a] << " max digit = ";
				if(cbase-1<10)
					cout << cbase-1;
				else
					cout << char(cbase-1-10+'A');
				cout << endl;
				error=true;
			}
			else
				base10 += (toupper(cnum[a]) - 'A' + 10) * pow(cbase,cnum.length()-1-a);

		else
		{
			cout << "Error - Invalid number in " << pow(cbase,cnum.length()-1-a) << "'s digit: " << cnum[a] << " max digit = ";
			if(cbase-1<10)
				cout << cbase-1;
			else
				cout << char(cbase-1-10+'A');
			cout << endl;
			error=true;
		}

	if(!error)
	{
		// Determines the number of digits that will be needed
		for(int maxdigit=0;base10/pow(fbase,maxdigit)>=1;maxdigit++);

		maxdigit--;

		// Converts to desired base
		for(maxdigit;maxdigit>=0;maxdigit--)
		{
			long temp = base10/long(pow(fbase,maxdigit));
			if(temp < 10)
				fnum += temp + '0';
			else
				fnum += temp + 'A' - 10;
			base10 -= temp * pow(fbase,maxdigit);
		}

		cout << "Final number in base " << fbase << ": " << fnum;
	}

	else
		cout << "Conversion unsuccessful.";

	cout << endl << endl;
	getch();
}