C++实现X进制到Y进制的转换

  • Post author:
  • Post category:其他


需求:

C++实现X进制转化为Y进制函数,其中X和Y为2到64之间的任意数. 如果用C或Java实现,请自己修改函数声明。    CString convert(int input_mod, CString input_value, int output_mod) 举例: convert(2, “1000”, 10)==”8″  //把二进制的”1000″转换为十进制,为”8″ convert(10, “2”, 2)==”10″  //把十进制的”2″转换为二进制,为”10″ convert(63, “Z”,10)==”61″  //把六十三进制的”Z”转换为十进制,为”61″ convert(64, “+”,10)==”62″  //把六十四进制的”+”转换为十进制,为”62″。

#include <string>
#include <iostream>
#include <stack>

using namespace std;

class BaseConversion
{
public:
    explicit BaseConversion(int input_mod, const string input_value, int output_mod);
    ~BaseConversion();
public:
    virtual string convert();

private:
    double fromXtoTen();
    string fromTentoY(double Ten_value);
    int findIndexOfChar(char ch);

private:
    static const char base64_elements[65];
    const string                                  input_value;
    const int                                     input_mod;
    const int                                     output_mod;
};

const char BaseConversion::base64_elements[65] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/";
BaseConversion::BaseConversion(int input_mod, const string input_value, int output_mod):input_value(input_value),input_mod(input_mod),output_mod(output_mod)
{}

BaseConversion::~BaseConversion()
{}

int BaseConversion::findIndexOfChar(char ch)
{
    if(ch == ' ')
    {
        cout << "Input character is null" << endl;
        return -1;
    }
    int length = 64;

    for (int i = 0; i < length-1; i++)
    {
        if(ch == base64_elements[i])
        {
            return i;
        }
    }

    return -1;
}

double BaseConversion::fromXtoTen()
{
    if (input_value == " " || input_mod < 1 || input_mod > 64)
    {
        cout << "Input value is invalid!" << endl;
        return -1;
    }

    int multiple_factor = 1;
    double result_ten = 0;
    char ch;

    int length = input_value.size();

    for(int i = 0; i < length; i++)
    {
        ch = input_value[length-1-i];
        result_ten += findIndexOfChar(ch) * multiple_factor;
        multiple_factor = multiple_factor * input_mod;
    }

    return result_ten;
}

string BaseConversion::fromTentoY(double Ten_value)
{
    if (output_mod < 1 || output_mod > 64 || Ten_value < 0)
    {
        cout << "Invalid input value" << endl;
        return "";
    }

    if (output_mod == 10)
    {
        return to_string(Ten_value);
    }

    double num_remain = Ten_value;

    stack<char> stack_temp;
    char output_Y[256]={'0'};
    int index = 0;

    while(num_remain >= 1)
    {
        index = (int)num_remain % output_mod;
        stack_temp.push(base64_elements[index]);
        num_remain = num_remain / output_mod;
    }
    int i = 0;
    while(!stack_temp.empty())
    {
        output_Y[i] = stack_temp.top();
        i++;
        stack_temp.pop();
    }

    return output_Y;
}

string BaseConversion::convert()
{
    if (output_mod < 1 || output_mod > 64 || input_value == " " || input_mod < 1 || input_mod > 64)
    {
        cout << "Invalid input value" << endl;
        return "";
    }

    if (output_mod == input_mod)
    {
        return input_value;
    }

    double ten_temp = 0.0;
    string result = "";
    //firstly, change to ten from x
    ten_temp = fromXtoTen();

    if (output_mod == 10)
    {
        return to_string(ten_temp);
    }
    //secondly, change to y from ten
    result = fromTentoY(ten_temp);

    return result;
}

int main()
{
    cout << "verify:" << endl;
    string value;
    BaseConversion base = BaseConversion(2, "1000", 10);
    value= base.convert();
    cout << value << endl;

    BaseConversion base1 = BaseConversion(10, "2", 2);
    value= base1.convert();
    cout << value << endl;

    BaseConversion base2 = BaseConversion(63, "Z", 10);
    value= base2.convert();
    cout << value << endl;

    BaseConversion base3 = BaseConversion(64, "+", 10);
    value= base3.convert();
    cout << value << endl;

    return 0;
}



版权声明:本文为wenmin_shu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。