题目一览
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制n(2≤n≤16)n(2≤n≤16),第二行是一个n进制数,若n>10n>10则用大写字母A−F表示数码10-15,并且该nn进制数对应的十进制的值不超过1000000000,第三行也是一个正整数,表示转换之后的数的进制m(2≤m≤16)m(2≤m≤16)。
输出格式
一个正整数,表示转换之后的m进制数。
输入输出样例
输入 #1
16 FF 2
输出 #1
11111111
铺垫学习
1.字符串求长度 -- k.size()--->k的长度
2.次方 -- pow(a,b)--->a的b次方
3.栈 查看别人解释栈
4.位置原理
思路分析
1.p进制 --> 10进制
首先我们要开一个string类型的变量来存储p进制,然后用位置原理来解决转化问题。(p进制中倒数第n位数的十进制数值为p的(n-1)次方)
for(int i = k.size()-1,j = 0;i>=0;i--,j++){
int h;
if(k[i] >='A') {
h = k[i] - 'A' + 10;
}else h = k[i] - '0';
n+=h*pow(q,j);}
2.10进制 --> q进制
这里因为我们要倒序存储,所以我选择用栈来存储。
while(n!=0){
a.push(n%p);
n/=p;
}
3.最后输出就行啦
while(!a.empty()){
if(a.top() >= 10){
cout << char('A'+(a.top()-10));//一定要强行转化,不然只得60分
}else cout << a.top();
a.pop();
}
AC代码
#include<bits/stdc++.h>
using namespace std;
stack <int> a;
int q,p; // 表示转化的进制
string k; //注意10进制以上
long long n; //10进制
int main(){
// q进制 -->10进制
cin >> q >> k >> p;
for(int i = k.size()-1,j = 0;i>=0;i--,j++){
int h;
if(k[i] >='A') {
h = k[i] - 'A' + 10;
}else h = k[i] - '0';
n+=h*pow(q,j);
}
// 10进制 --> p进制
while(n!=0){
a.push(n%p);
n/=p;
}
while(!a.empty()){
if(a.top() >= 10){
cout << char('A'+(a.top()-10));//一定要强行转化,不然只得60分
}else cout << a.top();
a.pop();
}
return 0;
}