吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5248|回复: 3
收起左侧

[会员申请] 申请会员ID:gxup320

[复制链接]
吾爱游客  发表于 2019-10-18 15:19
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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ouyangbao 发表于 2019-10-18 16:08
感觉很NB的样子,但是有什么用呢/
15774211127 发表于 2019-10-18 16:21
现在申请会员这么简单了吗,以前不是要看雪加精的帖子吗
Hmily 发表于 2019-10-18 20:38
抱歉,未能达到申请要求,申请不通过,可以关注论坛官方微信(吾爱破解论坛),等待开放注册通知。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 13:25

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表