【模板】进制转换(m~10~n)

进制转换其实一类特殊的数位拆解问题。

基本思路

要完成m进制到n进制的转换,只需要完成(1)m进制转换成10进制,(2)10进制转换成n进制。

对于(1),只需要依次计算每个数位与该位权重的积,然后累加即可。

对于(2),只需要不断地对这个数对n求模,再除以n即可,这一点是和10进制的数位拆解相似的。

注意点

1.当以字符串形式读入一个数时,字符串的低位时数值的高位。例如读入str="3346456",str[0]='3'。

2.为什么下面要使用do while语句,这是为了num==0时,保证循环至少一次。当然也可以其它方法处理这个问题,如count==0时,直接输出0。总之是要对0特殊处理。

#include<iostream>
using namespace std;
int main(void)
{
	int m;int n;//原进制和待转换进制
	while(cin>>m>>n)
	{
		string str;
		cin>>str;
		long long int num=0;
		for(int i=0;i<str.length();i++)
		{
			int temp;
			if(str[i]>='0'&&str[i]<='9') temp=str[i]-'0';
			else if(str[i]>='A'&&str[i]<='Z') temp=str[i]-'A'+10;
			else if(str[i]>='a'&&str[i]<='z') temp=str[i]-'a'+10; 
			num=num*m+temp;
		}//转换成10进制
		char ans[100];
		int count=0;
		do{
			int bit = num % n ;
			if(bit>=0&&bit<=9) ans[count]='0'+bit;
			else if(bit>=10&&bit<=36) ans[count]='A'+bit-10;
			num = num /n ;
			count++;
		}while(num);//转换为n进制 
		for(int i=0;i<count;i++) cout<<ans[count-i-1];
		cout<<endl;
	 } 
	 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值