P1017 [NOIP2000 提高組] 進位制轉換
阿新 • • 發佈:2021-08-22
一、求解步驟
原理: 被除數=除數*商+餘數
而餘數必須為大於等於\(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; }