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

题目概况

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

题目分析

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

代码实现

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

#include <iostream>
#include <cstdio>
#include <cstring>
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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

oier_Asad.Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值