关于进制转换

1.进制转换的方法
以二进制和十进制相互转换为例
1)十进制转二进制
十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。

具体用法如下图:

        

2)二进制转十进制
把二进制数按权展开、相加即得十进制数。

2.现在有如下需求:
将十进制和62进制(0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ)进行相互转换。
十进制转62进制,按照除62取余的方法,最后将余数逆序即可。
62进制转十进制,首先需要通过InitChrMap的方法将0-Z 62个字符和十进制一一对应。然后需要将62进制字符串逆序。最后通过按权展开相加即可得到十进制。

代码如下:

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "windows.h"
#include <iostream>
using namespace std;
const char* g_char = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
char g_charMap[255];

//十进制转为62进制
int NumToStr(int num, char* str)
{
	if (str == NULL)
	{
		return 0;
	}
	int scale = strlen(g_char);//得到进制
	if(num < scale)
	{
		str[0] = g_char[num];
		return 1;
	}

	//num除进制scale,余数为权位上的数,得到的商值继续除进制scale,依此步骤继续向下运算直至商为0为止。从最后一个余数到第一个余数。
	int mcale = 0;
	int i = 0;
	int j = 0;
	char chr[8] = {0};
	while ((mcale = num/scale) != 0)
	{
		chr[i++] = g_char[num%scale];
		num = mcale;
	}
	chr[i] = g_char[num];

	//转换成从最后一个余数到第一个余数(逆序)
	while (i>=0)
	{
		str[j++] = chr[i--];
	}
	str[j] = '\0';
	return j;
}


void InitChrMap()
{
	int i = 0;
	while (g_char[i] != '\0')
	{
		g_charMap[int(g_char[i])] = i;
		i++;
	}
}
//n的m次方,m为正
int NTimes (int n, int m)
{
	int ret = 1;
	if (n==0 || m<0)
	{
		return 0;
	}

	if (m == 0)
	{
		return 1;
	}

	for (int i = 0; i < m; i++)
	{
		ret *= n;
	}

	return ret;
}
//62进制转换成十进制
int StrToNum(char * str)
{
	if (str == NULL)
	{
		return -1;
	}

	int ret = 0;
	int len = strlen(str);
	char tmpStr[255] = {0};
	int scale = strlen(g_char);//得到进制
	int i = 0;

	//将str逆序
	while(len>0)
	{
		tmpStr[i] = str[len-1];
		i++;
		len--;
	}

	tmpStr[i] = '\0';
	i = 0;

	//按权展开相加即得十进制数
	while(tmpStr[i] != '\0')
	{
		ret += g_charMap[int(tmpStr[i])]*NTimes(scale, i);
		i++;
	}

	return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
	bool b_run = true;
	char str[255];
	char chr[255];

	InitChrMap();

	while (b_run)
	{
		memset(str, 0, sizeof(str));
		memset(chr, 0, sizeof(str));
		cin >> str;
		if (str[0] == 0)
		{
			Sleep(500);
			continue;
		}

		int num = StrToNum(str);

		cout << num << endl;

		NumToStr(num, chr);

		cout << chr << endl;
	}
	system("pause");
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值