思路和普通的十进制转任意进制相同,假设将M进制转N进制,则基本思路为:M/N的余数的N进制表示作为结果的第一位,商的M进制表示作为下一论循环的输入。直到M为0为止。
参考:http://www.cnblogs.com/pkuoliver/archive/2010/10/27/convert-m-number-to-n-number.html
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
char getStrFromInt(int value)
{
if(value >= 0 && value <= 9)
return (value + '0');
if(value >= 10 && value <= 35)
return ('a' + (value-10));
else
cout << "error!!!" << endl;
return '#';
}
int getIntFromStr(char value)
{
if(value >= '0' && value <= '9')
return value - '0';
else if(value >= 'a' && value <= 'z')
return (value - 'a') + 10;
}
char qiuyu(string &num, int M, int N)
{
int remain = 0;
string shang;
for(int i=0; i<num.size(); i++)
{
remain = remain*M + getIntFromStr(num[i]);
shang += getStrFromInt(remain / N);
remain = (remain % N);
}
while(shang.size() > 0 && shang[0] == '0')
{
shang = shang.substr(1, shang.size()-1);
}
num = shang;
return getStrFromInt(remain);
}
string baseConvert(string num, int M, int N)
{
string result;
string shang = num;
while(shang.size() > 0)
{
result += qiuyu(shang, M, N);
}
std::reverse(result.begin(), result.end());
return result;
}
int main()
{
string bin = "10101010101010101010101010101010110";
string b36 = baseConvert(bin, 2, 36);
cout << b36 << endl;
}