P1017 [NOIP2000 提高组] 进制转换

题目传送门

一、求解步骤

原理: 被除数=除数*商+余数
而余数必须为大于等于0的数字,为负数是没法表示的,所以当余数为负数时,需要进行特殊处理。
15为例:

cout << -15 % -2 ;   -->输出-1

由此可以看出,在C++的运算出来15,表示15=271 余数是1

但是,末位=-1 不行啊,余数不能是负的,需要再借一个2过来,加一个2,才能把余数转正.
15=(272)+(1+2)
15=2(7+1)+1
借一个2过来后,发生了两件事,
(1)原来的被借的数字需要再减去一个2,而余数可以加上这个2.变成1+2=1

(2)但向上一位借了一个 2,被借数就小了一个2,就是需要多减12!!!多减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;
}
posted @   糖豆爸爸  阅读(162)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2019-08-22 使用Navicat生成ER关系图并导出
2015-08-22 理想智慧云
Live2D
点击右上角即可分享
微信分享提示