思路:
首先,不管对于什么语言来说,被除数=商*除数+余数
,这是解决问题的关键
例如,在c语言中:(-7)%(-3)= (-1) (-7)/(-3)= 2
而(-7)(被除数)= 2 (商)*(-3)(除数) +(-1)(余数)
但是因为我们是不断取余数倒序为转换结果,所以余数不能出现负数,那怎么办呢?
我们只需要将商+1,余数-除数即可,因为余数(绝对值)一定小于除数,所以余数-除数一定大于0,我们把余数-除数的值作为余数
正确性证明:
(商+1)* 除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数
代码如下:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<cmath>
typedef long long ll;
using namespace std;
int n,r;
void change(int n,int r){//n为被除数,r为除数
if(n==0) return;
int m=n%r;
if(m<0){//如果余数小于0,则余数=余数-除数
m-=r;
n+=r;//被除数增加r是为了让商+1
}
//将余数转化为ASCLL码输出
if(m>=10){
m='A'+m-10;
}else{
m=m+'0';
}
change(n/r,r);//
printf("%c",m);
}
int main(){
scanf("%d%d",&n,&r);
printf("%d=",n);
change(n,r);//变换进制
printf("(base%d)",r);
return 0;
}