演算法筆記 — 數制轉換
阿新 • • 發佈:2018-11-25
題目連結: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; }