难点:
首先,不管对于什么语言,
被除数=商*除数+余数,
这是解决问题的关键
例如在C++里,-15%-2=-1,-15/-2=7,而7*-2+(-1)=-15
但是因为我们是不断取余数倒序为转换结果,所以余数不能出现负数,那怎么办呢?
我们只需要将商+1,余数-除数即可,因为余数(绝对值)一定小于除数,所以这样就可以将余数装换为正数
正确性证明:
(商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数
int y = n % r;
if (y < 0) {
y -= r;
n += r;
}
注意:这里为什么n要加上r 呢,因为商加了一个1,其实他本质上是n加了一个r。下面的好像不对
应该就是这样。
AC代码:
#include<iostream>
using namespace std;
int a[64];
int main() {
int n, r;
cin >> n >> r;
int t = n;
int cnt = 0;
while (n) {
int y = n % r;
if (y < 0) {
y -= r;
n += r;
}
a[++cnt] = y;
n /= r;
}
cout << t << '=';
for (int i = cnt; i >= 1; i--) {
if (a[i] > 9) {
printf("%c", a[i] - 10 + 'A');
} else cout << a[i];
}
cout << "(base" << r << ')';
return 0;
}
标签:cnt,转换,进制,int,余数,被除数,除数,cout From: https://www.cnblogs.com/msluli/p/16772024.html