需求:
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 版权协议,转载请附上原文出处链接和本声明。