- 一开始想偷懒,发现测试样例还是有大数,没办法只好用字符串乘除法
- 注意除法要返回余数,不能直接根据字符串末尾得到余数
- 注意字符和数字的转换
#include<iostream>
#include<stack>
using namespace std;
void getadd(string &s,int x){//字符串加法
int cur=x;
for(int i=s.size()-1;i>=0;i--){
cur=cur+s[i]-'0';//和
s[i]=cur%10+'0';//和的最低位
cur=cur/10;//进位
}
while(cur!=0){//加法计算完仍有进位
char c=cur%10+'0';
s.insert(0,1,c);
cur=cur/10;
}
}
int getdiv(string &s,int x){//字符串除法
int k=0;
for(int i=0;i<s.size();i++){
int cur=s[i]-'0'+k*10;//被除数
s[i]=cur/x+'0';//商
k=cur%x;//余数
}
int pos=0;
while(s[pos]=='0')pos++;//删掉前面多余0
s=s.substr(pos);
return k;//返回余数
}
void getmul(string &s,int x){//字符串乘法
int cur=0;
for(int i=s.size()-1;i>=0;i--){
cur=cur+x*(s[i]-'0');//乘积
s[i]=cur%10+'0';//乘积最低位
cur=cur/10;//进位
}
while(cur!=0){//乘法计算完仍有进位
char c=cur%10+'0';
s.insert(0,1,c); //按位依次插入到最前面
cur=cur/10;
}
}
int main(){
int m,n;
string x,number;
stack<char>ans;
scanf("%d%d",&m,&n);
cin>>x;
for(int i=0;i<x.size();i++){//m进制转十进制
int a;
if(x[i]>='A'&&x[i]<='Z')a=x[i]-'A'+10;
else a=x[i]-'0';
getmul(number,m);
getadd(number,a);
}
while(!number.empty()){//十进制转n进制
int c;
char d;
c=getdiv(number,n);
if(c<=9)d=c+'0';
else d=c-10+'a';
ans.push(d);
}
while(!ans.empty()){//用栈输出
printf("%c",ans.top());
ans.pop();
}
return 0;
}