申请会员ID:gxup320
1、 申 请 I D:gxup3202、 个人邮箱:gxup320@outlook.com
3、 原创技术文章:进制转换算法
注:该文章为原创,之前发布在CSDN,作论坛申请用。
进制转换算法
转换流程:
http://gxup320.320.io:320/bbsfile/forum/201908/03/122425fcckoq3c9b3ysc2p.png
进制转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 >= 'A' && source <= 'Z')
{
data = source - 'A' + 10;
}
else if (source >= 'a' && source <= 'z')
{
data = source - 'a' + 10;
}
else
{
data = source - '0';
}
}
int sum, d;
int* output = NULL, k = 0;
do
{
sum = 0;
for (int i = 0; i < source_length; i++)
{
d = data / aims_base;
sum += d;
if (i == source_length - 1)
{
output = (int*)realloc(output, (k + 1) * sizeof(int));
output = data % aims_base;
k++;
}
else
{
data += (data % aims_base) * source_base;
}
data = d;
}
} while (sum);
aims = (char*)malloc((k + 1) * sizeof(char));
aims = '\0';
for (int i = 0; i < k; i++)
{
if (output > 9)
{
aims = output + 'A' - 10;
}
else
{
aims = output + '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
感觉很NB的样子,但是有什么用呢/ 现在申请会员这么简单了吗{:1_904:},以前不是要看雪加精的帖子吗 抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
页:
[1]