10进制与任意进制之间的相互转换

将一个十进制数x转换为任意进制数m(m<16)

递归:

#include
char d[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

int turn(int n, int k)//将n转为k进制 
{
	int r=0;
	r = n%k; 
	n = n/k;
	if(n!=0) turn(n,k);
	printf("%c",d[r]); 
}


int main()
{
	int x, m;
	scanf("%d%d",&x,&m);
	turn(x,m);
	return 0;
}

非递归

#include
char d[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
 
char a[100];
int turn(int n,int k)
{
	int r = 0;
	while(n!=0)
	{
		a[++r] = n%k;
		n = n/k;
	}
	for(int j = r; j >= 1; -- j)
		printf("%c",d[a[j]]);
}

int main()
{
	int x, m;
	scanf("%d%d",&x,&m);
	turn(x,m);
	return 0;
}

更新:2020.3.10

任意进制转十进制

1101(2)= 1*2^0 + 0 * 2^1 + 1 *2^2 + 1* 2^3

ABC(16) = C*16^0 + B*16^1 + A*16^2 = 12*16^0 + 11*16^1 + 10*16^2

这里需要注意计算时需要将字母转成数字进行计算。比如A=>10 F=>15

'A'-'0'-7 即可将字符‘A'转成数字 10

用ans记录每一项相加的结果,用k来记录位数计算到几次方了。

#include
using namespace std;
int r_to_ten(string s, int r)//A2(16)=2*16^0+A*16^1=162 r进制的数s转成10进制 
{
	int len = s.length();
	int ans = 0;//记录每一项相加的结果 
	int k = 1;//记录位数 
	for(int i = len-1; i >= 0; i--){
		if(s[i] >= 'A') ans += (s[i]-'0'-7)*k;//大于10的数需要将字母转成数字 
		else ans += (s[i]-'0')*k;//小于10的数直接相乘即可 
		k*=r;
	}
	return ans; 
} 
int main()
{
	cout << r_to_ten("12323",4) << endl;//443
	cout << r_to_ten("A2",16);//162 
	return 0;
} 

十进制转任意进制

123(10) 转为2 进制,需要不断的除以2,余数倒序输出。

数组的做法:

#include
using namespace std;
string r_to_ten(int n, int r)//将10进制的n转为r进制  23 2
{
	char str[105] = {0}, s[105] = {0};
	int k = 0;
	while(n!=0)
	{
		str[k++] = n%r;//将余数直接存起来 
		n = n/r;
	}
	int m = 0;
	for(int i = k-1; i >= 0; --i)//倒序输出余数即为转换后的答案 
	{
		if(str[i] >= 10 ) s[m++] = str[i] - 10 + 'A';//大于10时数字转字符 如10 -> A  
		else s[m++] = str[i] + '0';//数字转字符 
	} 
	return s;
}
int main()
{
	cout << r_to_ten(1024,16);
	return 0;
}

栈的做法:

#include
using namespace std;
string r_to_ten(int n, int r)//将10进制的n转为r进制  23 2
{
	char s[105] = {0};
	int k = 0;
	stack str; 
	while(n!=0)
	{
		str.push(n%r);//将余数存在栈中 
		n = n/r;
	}
	int m = 0;
	while(!str.empty())//倒序输出余数即为转换后的答案 
	{
		int t = str.top();
		if(t >= 10 ) s[m++] = t - 10 + 'A';//大于10时数字转字符 如10 -> A  
		else s[m++] = t + '0';//数字转字符 
		str.pop();
	} 
	return s;
}
int main()
{
	cout << r_to_ten(1235,8);
	return 0;
}

你可能感兴趣的:(进制转换,栈,递归)