首先需要明白正进制的转换,比如7转换成二进制,那么7/2=3余1,3/2=1余1,1/2=1余0,所以7的二进制就是倒着写余数0111
那么如果-7转换成-2进制呢,因为-7/-2=3余-1,所以我们这个-1没法处理,所以我们需要一个看起来很简单但是想不到的转换公式:
(商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数
也就是我们当-7/-2=3余-1时,把-1-(-2)=1,然后3+1=4,此时4*-2+1=-7依旧成立,然后因为我们传参时候需要传递商,所以我们要保证商不变的话只要 被除数=被除数+除数,这样 商=被除数/除数--->(被除数+除数)/除数=商+1
所以这样一来我们的余数成功的转换成了正数,并且等式依旧成立
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
void fun(int n,int r)
{
if(n==0)
return;
int m=n%r;//取余
if(m<0)
{
m-=r;
n+=r;
}
if(m>=10)
m='A'+m-10;
else
m+='0';
fun(n/r,r);
printf("%c",m);
return;
}
int main()
{
int n,r;
string ans="";
cin>>n>>r;
cout<<n<<"=";
fun(n,r);
printf("(base%d)",r);
system("pause");
return 0;
}