进制转换

题目描述

请你编一程序实现两种不同进制之间的数据转换。

输入格式

共三行,第一行是一个正整数,表示需要转换的数的进制 n (2 ≤ n ≤ 16),第二行是一个 n 进制数,若 n>10 则用大写字母 A∼F 表示数码 10∼15,并且该 n 进制数对应的十进制的值不超过 10^9,第三行也是一个正整数,表示转换之后的数的进制 m (2≤m≤16)。

输出格式

一个正整数,表示转换之后的 m 进制数。

输入输出样例

输入 1

16
FF
2

输出 1

11111111

看到这道题,我么首先的思路是先将n进制数转化为一个十进制数,再将十进制数转化为m进制数

将n进制转化为十进制的方法为:将n进制数每一位依次乘n的对应次方

比如将二进制数1011011转化为十进制

二进制转化十进制程序如下:

int a[1001]={};
string s;//s是二进制数
cin>>s;
for(int i=0;i<a.length();i++){
    a[i]=int(s[i])-48;//存入a数组('0'的ASCII码是48)
}
int shi=0;
for(int i=0;i<a.length();i++){
    shi+=pow(2,n-i-1)*a[i];//转换每一位
    //由于是从左到右从小到大,所以是2的n-i-1次方
}
//最后变量shi中存的就是转化后的十进制数

下一步就是把转化后的十进制数给转换为m进制的数:

将十进制数转化为m进制数的方法是:一直除以m,直到为零,将过程中的余数反过来,就成了对应的m进制数。

又拿二进制数来举例吧!

比如将十进制数53转化为二进制数:

所以十进制数53的二进制数就是110101

代码如下:

stack<char> tt;//由于要倒序,所以用栈来存储
//shi中存储的是十进制数
while(shi){
	int t=shi%bj;//余数
	if(t>=10)tt.push(char(t+55));//如果大于十,要存入字母
	else tt.push(char(t+48));//否则就直接存数字
	shi/=bj;//取到除以m之后的数
}
while(tt.size()){//输出
	cout<<tt.top();
	tt.pop();
}

解决了以上问题,代码就很好写了

#include<bits/stdc++.h>
using namespace std;
int s[10001];
int main(){
	int aj;
	cin>>aj;
	string a;
	cin>>a;
	for(int i=0;i<a.length();i++){
		if(a[i]>='0'&&a[i]<='9')
			s[i]=int(a[i])-48;
		else
			s[i]=int(a[i])-55;
	}
	int bj;
	cin>>bj;
	int shi=0;
	for(int i=0;i<a.length();i++){
		shi+=pow(aj,a.length()-i-1)*s[i];
	}
	stack<char> tt;
	while(shi){
		int t=shi%bj;
		if(t>=10)tt.push(char(t+55));
		else tt.push(char(t+48));
		shi/=bj;
	}
	while(tt.size()){
		cout<<tt.top();
		tt.pop();
	}
 	return 0;
}

posted on 2023-12-15 18:24  fish2012  阅读(23)  评论(0)    收藏  举报  来源