思路:对于这种进制转换问题,基本都是采取辗转相除法进行转换,对于该题不同的是该题的除数是为负数,故每次的余数可能为负,当这种情况,我们只需要讲余数减去除数,再讲商+1即可。 (商+1)除数+(余数-除数)=商除数+除数+余数-除数=商*除数+余数=被除数
#include<bits/stdc++.h>
using namespace std;
char c[21]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','G','K'};
void solve(int now,int p)
{
if(now==0) return;
int cnt=now%p;
if(cnt<0) solve(now/p+1,p);
else solve(now/p,p);
if(cnt<0) cnt-=p;
cout<<c[cnt];
}
int main()
{
int n,R;
while(cin>>n>>R)
{
cout<<n<<"=";
solve(n,R);
printf("(base%d)\n",R);
cout<<endl;
}
}