1. 程式人生 > 其它 >P1017 [NOIP2000 提高組] 進位制轉換

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;
}