P1017 [NOIP2000 提高组] 进制转换

题目传送门

一、求解步骤

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

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

由此可以看出,在C++的运算出来\(-15 % -2=-1\),表示\(-15= -2 * 7 -1\) 余数是\(-1\)

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

(2)但向上一位借了一个 \(2\),被借数就小了一个\(2\),就是需要多减\(1\)\(2\)!!!多减\(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 @ 2021-08-22 12:11  糖豆爸爸  阅读(140)  评论(0编辑  收藏  举报
Live2D