一般的数字进制转换大家都很熟悉,先转换为十进制数字,再进行 除 n 取余,这种情况适用于操作数不大的情况(不大于最大的基本数据类型(long long)),但是如果操作数上百位以上甚至上千上万该怎么办呢,显然,传统的方法肯定不行, 我们可以举个例子:将十进制数字 12 转换为 2 进制数字
第一轮运算中 1 / 2 = 0...1 随后用 1 * 10 + 2 = 12 除以 2 得到 6...0
第二轮运算中 6 / 2 = 3...0
第三轮运算中 3 / 2 = 1...1
第四轮运算中 1 / 2 = 0...1
所以 十进制数 12 转换为 二进制为 1100
通过这个例子,我们可以看出:如果除数比被除数小,则向后退一位,如果仍然比被除数小,继续退。。。,如果到了结尾,则结束运算,得出结果,如果除数不比被除数小,则
用处数除以被除数,得到商和余数,余数作为结果储存,商用于做下一轮运算。。。直到数字到了末尾,得出结果。
下面是代码:
</pre><p><pre name="code" class="cpp">#include <iostream>
#include <string>
#include <cctype>
#include <cstring>
using namespace std;
const int old_binary = 10;
const int new_binary = 16;
int result[1000];
int Trans(string str) // 进制转换,返回为结果数组的长度
{
int num[1000] = {0};
int save_num[1000] = {0};
int len = str.length();
for(int i = 0; i < len; i++) // 转换为数值储存在数组中
{
if(isdigit(str[i]))
{
num[i] = str[i] - '0';
}
else if(islower(str[i]))
{
num[i] = str[i] - 'a' + 10;
}
else if(isupper(str[i]))
{
num[i] = str[i] - 'A' + 10;
}
}
int res_len = 0;
int i, j;
for(int m = len; m > 0;)
{
int remainder = 0;
for(i = 0; i < m; i++)
{
remainder = remainder * old_binary + num[i];
save_num[i] = remainder / new_binary;
remainder %= new_binary; // 取得每一次除的结果的余数
}
j = i; // 储存本轮除运算结束后的商的位数,为下轮准备
result[res_len++] = remainder; // 最后一次取得的余数作为本轮的取余结果储存并等待输出
i= 0;
while(i < j && 0 == save_num[i]) // 去除商中的前导 0
{
i++;
}
memset(num, 0, sizeof(num)); // 清除本轮的除数
m = 0;
for(i; i < j; i++)
{
num[m++] = save_num[i]; // 将这一轮的商作为下一轮的除数,得到下一轮除数
}
memset(save_num, 0, sizeof(save_num)); // 清除这一轮的商,为下一轮做准备
}
return res_len;
}
void Output(int len) // 高位倒序输出结果
{
for(int i = len - 1; i >= 0; i--)
{
cout << (result[i] > 9 ? (char) (result[i] + 55) : (char) (result[i] + '0'));
}
}
int main()
{
string str;
cin >> str;
Output(Trans(str));
return 0;
}