1、 申 请 I D:gxup320
2、 个人邮箱:gxup320@outlook.com
3、 原创技术文章:进制转换算法
注:该文章为原创,之前发布在CSDN,作论坛申请用。
进制转换算法
转换流程:
进制转C++代码示例
[C++] 纯文本查看 复制代码 #include <iostream>
#include <string>
void base_conversion(const char* source, int source_base, char** aims_return, int aims_base)
{
char* aims = NULL;
int source_length = strlen(source);
int* data = (int*)malloc(source_length * sizeof(int));
int temp;
for (int i = 0; i < source_length; i++)
{
if (source[i] >= 'A' && source[i] <= 'Z')
{
data[i] = source[i] - 'A' + 10;
}
else if (source[i] >= 'a' && source[i] <= 'z')
{
data[i] = source[i] - 'a' + 10;
}
else
{
data[i] = source[i] - '0';
}
}
int sum, d;
int* output = NULL, k = 0;
do
{
sum = 0;
for (int i = 0; i < source_length; i++)
{
d = data[i] / aims_base;
sum += d;
if (i == source_length - 1)
{
output = (int*)realloc(output, (k + 1) * sizeof(int));
output[k] = data[i] % aims_base;
k++;
}
else
{
data[i + 1] += (data[i] % aims_base) * source_base;
}
data[i] = d;
}
} while (sum);
aims = (char*)malloc((k + 1) * sizeof(char));
aims[k] = '\0';
for (int i = 0; i < k; i++)
{
if (output[k - i - 1] > 9)
{
aims[i] = output[k - i - 1] + 'A' - 10;
}
else
{
aims[i] = output[k - i - 1] + '0';
}
}
*aims_return = aims;
if (data != NULL)
{
free(data);
}
}
int main()
{
int source_base = 0;
std::cout << "输入原进制:";
std::cin >> source_base;
while (getchar() != 10);//清空输入缓冲区
std::cout << "输入数值:";
std::string str;
std::cin >> str;
char* data = NULL;
for (int i = 2; i <= 36; i++)//转换2至36进制
{
base_conversion(str.c_str(), source_base, &data, i);
std::cout << "转换为" << i << "进制:" << data << std::endl;
free(data);
data = 0;
}
}
示例:10进制123456转化为16进制,详细算法解析首先将每一位分开并以十进制储存1 2 3 4 5 61/16=0(记录到第一位)1%16*10=10(加到第二位)0 12 3 4 5 612/16=0(记录到第二位)12%16*10=120(加到第三位)0 0 123 4 5 6123/16=7(记录到第三位)123%16*10=110(加到第四位)0 0 7 114 5 6114/16=7(记录到第四位)114%16*10=20(加到第五位)0 0 7 7 25 625/16=1(记录到第五位)25%16*10=90(加到第六位)0 0 7 7 1 9696/16=6(记录到第六位)96%16=0(作为十六进制第一位)00 0 7 7 1 6十进制不为0再来一遍7 7 1 67/16=0(记录到第一位)7%16*10=70(加到第二位)0 77 1 677/16=4(记录到第二位)77%16*10=130(加到第三位)0 4 131 6131/16=8(记录到第三位)131%16*10=30(加到第四位)0 4 8 3636/16=2(记录到第四位)96%16=4(作为十六进制第二位)040 4 8 2十进制不为0再来一遍4 8 24/16=0(记录到第一位)4%16*10=40(加到第二位)0 48 248/16=3(记录到第二位)48%16*10=0(加到第三位)0 3 22/16=0(记录到第三位)2%16=2(作为十六进制第三位)0420 3 0十进制不为0再来一遍3 03/16=0(记录到第一位)3%16*10=30(加到第二位)0 3030/16=1(记录到第二位)30%16=14(作为十六进制第四位)042E0 1十进制不为0再来一遍11/16=0(记录到第一位)1%16=1(作为十六进制第五位)042E10十进制为0,结束,把十六进制倒过来最终答案:1E240
|