P1143进制转换

进制转换

题目描述

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

输入格式

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

输出格式

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

样例 #1

样例输入 #1

16
FF
2

样例输出 #1

11111111
#include
using namespace std;
unordered_map<char,int> mp={{'A',10},{'B',11},{'C',12},{'D',13},{'E',14},{'F',15}};
unordered_map<int,char> tp;
int n,m;
string x;
int powm(int x,int b)
{
	if (b==0) return 1;
	int res=powm(x,b/2);
	res=res*res;
	if (b%2==0) return res;
	return res*x;
}
int t10()
{
	stringstream in(x);
	char t;int num;int sum=0;
	int i=x.size()-1;
	while(in>>t)
	{
		num=mp[t];
		sum+=num*powm(n,i);
		i--;
	}
	return sum;
}
stack<char> st;
void write(int num)
{
	while(num){
		int mod=num%m;
		st.push(tp[mod]);
		num/=m;
	}
	while(!st.empty()) cout<<st.top(),st.pop();
}
int main()
{
	for (int i=0;i<=9;i++) mp[i+'0']=i,tp[i]=i+'0';
	for (int i=0;i<=5;i++) tp[i+10]=i+'A';
	cin>>n>>x>>m;
	write(t10());
	return 0;
}

简单题,证明略

你可能感兴趣的:(算法)