一、求解步骤
原理: 被除数=除数*商+余数
而余数必须为大于等于(0)的数字,为负数是没法表示的,所以当余数为负数时,需要进行特殊处理。
以(-15 % -2)为例:
cout << -15 % -2 ; -->输出-1
由此可以看出,在C++的运算出来(-15 % -2=-1),表示(-15= -2 * 7 -1) 余数是(-1)
但是,末位=-1 不行啊,余数不能是负的,需要再借一个(2)过来,加一个(2),才能把余数转正.
(-15= (-2 * 7 - 2) + (-1 + 2))
(-15= -2 * (7+1) + 1)
借一个(2)过来后,发生了两件事,
(1)原来的被借的数字需要再减去一个(2),而余数可以加上这个(2).变成(-1+2=1)
(2)但向上一位借了一个 (2),被借数就小了一个(2),就是需要多减(1)个(2)!!!多减(1)个!!多减(1)个!
多了(1)个,这里多了(1)个就是 被除数=(-15),除数=(-2),余数=(1),那么 “商”=(8),也就是,原来的商由(7)就成了(8),
就是商加了(1)!
二、完整代码
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int n, r;
int a[N], idx;
/**
测试数据:
-15 -2
结果 110001
*/
int main() {
cin >> n >> r;
cout << n << "=";
//数位分离
while (n) {
a[idx] = n % r; //余数
n /= r; //商
if (a[idx] < 0) { //余数不能是负的,如果是负的,需要借位
a[idx] += (-r); //借位增加(-r)
n++; //商++
}
idx++;
}
//倒序
for (int i = idx - 1; i >= 0; i--)
if (a[i] >= 10)
printf("%c", (char) ('A' + a[i] - 10));
else printf("%d", a[i]);
cout << "(base" << r << ")";
return 0;
}