进制转换
题目描述
请你编一程序实现两种不同进制之间的数据转换。
输入格式
共三行,第一行是一个正整数,表示需要转换的数的进制\(n(2≤n≤16)\),第二行是一个n进制数,若\(n>10\)则用大写字母\(A-F\)表示数码\(10-15\),并且该\(n\)进制数对应的十进制的值不超过\(1000000000\),第三行也是一个正整数,表示转换之后的数的进制\(m(2≤m≤16)\)。
输出格式
一个正整数,表示转换之后的\(m\)进制数。
样例 #1
样例输入 #1
16
FF
2
样例输出 #1
11111111
思路
由于考虑的是n进制转m进制,最正常的想法是将n进制转10进制,再从10进制转m进制。
先考虑n转10:
for(int i=s.length()-1;i>=0;i--){
if(s[i]>='0'&&s[i]<='9'){
cnt+=(s[i]-'0')*pow(n,s.length()-i-1);
}else{
cnt+=(s[i]-'A'+10)*pow(n,s.length()-i-1);
}
}
其中考虑到10进制往上以字母表示,因此else中的s[i]-'A'+10表示的是10-16的数(题目n的范围不大),此时得到的cnt为10进制下表示的数。
int t;
int d=0;
while(cnt!=0){
t=cnt%m;
a[d++]=t;
cnt/=m;
}
此时就是将10进制往m进制转了,那么d表示的是这一位的数,以便后面可以用具体的数字进行表示。
完整代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<unordered_map>
using namespace std;
char show[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char a[10001];
int main(){
int n,m;
string s;
cin>>n>>s>>m;
int cnt=0;
for(int i=s.length()-1;i>=0;i--){
if(s[i]>='0'&&s[i]<='9'){
cnt+=(s[i]-'0')*pow(n,s.length()-i-1);
}else{
cnt+=(s[i]-'A'+10)*pow(n,s.length()-i-1);
}
}
int t;
int len=0;
while(cnt!=0){
t=cnt%m;
a[len++]=t;
cnt/=m;
}
for(int i=len-1;i>=0;i--){
cout<<show[a[i]];
}
return 0;
}
标签:10,cnt,转换,进制,16,int,p1143,include
From: https://www.cnblogs.com/simdow/p/16929139.html