【洛谷题解/NOIP2000提高组】P1017 进制转换

题目概况

链接:https://www.luogu.com.cn/problem/P1017
难度:普及/提高-

题目分析

一道数学题。
首先我们知道,十进制转N进制需要采用除法取余,倒序输出的方法。但是题目中说明:使用的是负进制。
它的转换方法和正整数进制相同(详情移步度娘),但我们就会发现一个问题:在C++中取模给出了负数
如图,-15 % -7 = -1
【洛谷题解/NOIP2000提高组】P1017 进制转换_第1张图片
那问题明了,如何将负数化为非负数?
解答: 已知:商*除数+余数=被除数,则样例为 2 * (-7) + (-1) = -15,我们可以把商加上1(等同于被除数再加一个除数),然后余数减去一个除数的方式转化为非负数。
That’s all,然后就可以切题了

代码实现

考虑运用递归,递时转换、归时输出

#include 
#include 
#include 
using namespace std;

void change(int n, int r) {
	if (n == 0) { //如果被除数为0,结束递,开始归
		return;
	}

	int m = n % r; //m指余数,但是后几行换成ASCII码(因为还有用字母的情况)

	if (m < 0) { //如果余数是负数
		n += r; //被除数加一个除数
		m -= r; //余数减一个除数
	}
	
	if (m >= 10) { 
		m = 'A' + m - 10; //十六进制处理,直接转换ASCII码
	} else {
		m += '0'; //没事就直接转换成字符数字
	}

    change(n / r, r); //继续递
    
	cout << (char)m; //由于倒序输出,我们需要在递归后输出(即归时输出)
}

int main() {
	int n, r; //被除数,除数 
	cin >> n >> r;
	cout << n << "=";
	change(n, r);
	cout << '(' << "base" << r << ')';
	return 0;
}

你可能感兴趣的:(洛谷题解,【算法】基础算法,OI往年真题题解,c++,c语言,算法)