// Micheal H. McCabe
// September 5, 2009
// CSCI-230 
// Professor Bennett

#include <iostream>
#include <cmath>
#include <string>

using namespace std;

int cvt_char (char char_digit)
{
    int return_value=0;
    if (char_digit>='0' && char_digit<='9')
       return_value = (int) char_digit-'0';
    else if (char_digit>='A' && char_digit<='Z')
            return_value = (int) char_digit-'A'+10;
            else return_value=255;                 // Error value
    return return_value;
}

char cvt_num (int num)
{
     char return_value =(char) 255;
     if (num>=0 && num<=9)
        return_value = (char) num + '0';
     else if (num>=10 && num <=36)
             return_value = (char) num-10+'A';
             else return_value = (char) 255;       // Error value (again)
     return return_value;
}

string cvt_10_N(int num, int base)
{
       string output_string="";
       int quotient;
       int remainder;
       while (num!=0)
       {
             quotient=(int) num / base;
             remainder=num % base;
             output_string=cvt_num(remainder)+output_string;
             num = quotient;
             }
       return output_string;
}

int cvt_N_10(string baseN, int base)
{
       int output=0;
       int length=baseN.length();
       int place_value;
       int digit;
       int i;
       int sum=0;
       for (i=length; i>=1; i--)
           {
             place_value=(int)pow((float)base,(float)i-1);
             digit=cvt_char(baseN[length-i]);
             sum+=digit*place_value;
             }
       return sum;
}
       
int main()
{
    int base_ten_number;
    int desired_base;
    string base_n_string;
    char loop_test = 'Y';
    while (loop_test!='N')
          {
          cout << "Okay, give me a base 10 number: ";
          cin >> base_ten_number;
          cout << endl;
          cout << "What base do you want it converted to? ";
          cin >> desired_base;
          cout << endl;
          base_n_string = cvt_10_N(base_ten_number, desired_base);
          cout << "The converted number is: " << base_n_string << endl;
          cout << endl;
          base_ten_number = cvt_N_10(base_n_string, desired_base);
          cout << "Converting it back gives: " << base_ten_number << endl;
          cout << endl;
          cout << "Run again? ";
          cin >> loop_test;
          }
    cout << "Thanks for playing, and bye-bye for now!" << endl;
    return 0;
}
 
        
    
