• 一开始想偷懒,发现测试样例还是有大数,没办法只好用字符串乘除法
  • 注意除法要返回余数,不能直接根据字符串末尾得到余数
  • 注意字符和数字的转换
#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;
}