1. 程式人生 > >演算法筆記 — 數制轉換

演算法筆記 — 數制轉換

 

題目連結:http://codeup.cn/problem.php?cid=100000579&pid=1

題目描述

求任意兩個不同進位制非負整數的轉換(2進位制~16進位制),所給整數在long所能表達的範圍之內。
不同進位制的表示符號為(0,1,...,9,a,b,...,f)或者(0,1,...,9,A,B,...,F)。

輸入

輸入只有一行,包含三個整數a,n,b。a表示其後的n 是a進位制整數,b表示欲將a進位制整數n轉換成b進位制整數。a,b是十進位制整數,2 =< a,b <= 16。

輸出

可能有多組測試資料,對於每組資料,輸出包含一行,該行有一個整數為轉換後的b進位制數。輸出時字母符號全部用大寫表示,即(0,1,...,9,A,B,...,F)。

樣例輸入

4 123 10

樣例輸出

27

提示

用字串儲存和表示不同進位制的數。

 

#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
char str[1111];
char ans[1111];
ll to_d(ll a){
	int len=strlen(str);
	ll sum=0;
	int x;
	int cnt=1;
	for(int i=len-1;i>=0;i--){
		if(str[i]>='0'&&str[i]<='9'){
			x=str[i]-'0';
		}else if(str[i]>='A'&&str[i]<='F'){
			x=str[i]-'A'+10;
		}else{
			x=str[i]-'a'+10;
		}
		sum+=x*cnt;
		cnt*=a;
	}
	return sum;
}
void to_other(ll sum,ll b){
	int cnt=0;
	do{
		int temp=sum%b;
		if(temp<10){
			ans[cnt++]=temp+'0';
		}else{
			ans[cnt++]=temp+'A'-10;
		}
		sum/=b;
	}while(sum!=0);
	for(int i=cnt-1;i>=0;i--){
		cout<<ans[i];
	}
	cout<<endl;
}
int main(){
	ll a,b;
	while(~scanf("%ld%s%ld",&a,&str,&b)){
		ll d=to_d(a);
		to_other(d,b);
	}
	return 0;
}