【进制转换+高精度 poj 1220】
关键步骤》
while(start[0]>=i){ //进制转换
y=y*oldBase+start[i];
ans[i++]=y/newBase;
y%=newBase;
}
代码》
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
/* 【进制转换】poj 1220
在T组高精度数据中,将每个数据从进制m转化为进制n */
const int MAXN = 1005;
char str[MAXN];
int ans[MAXN],res[MAXN],start[MAXN];
int oldBase,newBase;
int getNum(char c){
if(c>='0'&&c<='9') return c-'0'; //数字
if(c>='A'&&c<='Z') return c-'A'+10; //大写字母
return c-'a'+36; //小写字母
}
char getChar(int c){
if(c>=0&&c<=9) return c+'0';
if(c>=10&&c<=35) return c-10+'A';
return c-36+'a';
}
void change(){ //每一位变成数字
start[0]=strlen(str);
for(int i=1; i<=start[0]; i++)
start[i]=getNum(str[i-1]);
}
void solve(){
memset(res,0,sizeof(res));
while(start[0]>=1){
int i=1,y=0;
ans[0]=start[0];
while(start[0]>=i){ //进制转换
y=y*oldBase+start[i];
ans[i++]=y/newBase;
y%=newBase;
}
res[++res[0]]=y;
i=1;
while(i<=ans[0]&&ans[i]==0) i++;
memset(start,0,sizeof(ans));
for(int j=i; j<=ans[0];j++) start[++start[0]]=ans[j];
memset(ans,0,sizeof(ans));
}
}
void print(){
cout<<oldBase<<" "<<str<<endl<<newBase<<" ";
for(int i=res[0]; i>=1; i--) cout<<getChar(res[i]);
cout<<endl<<endl;
}
int main(){
int t; cin>>t;
while(t--){
cin>>oldBase>>newBase>>str;
change(); solve(); print();
}
return 0;
}