进制转换

题目链接

难点:

首先,不管对于什么语言,

被除数=商*除数+余数,

这是解决问题的关键

例如在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;

}

 

posted @ 2022-10-09 14:29  Luli&  阅读(27)  评论(0编辑  收藏  举报