Codebar 程式酒吧

一座輕鬆學習程式的酒吧

0%

a034. 二進位制轉換

題目連結

https://zerojudge.tw/ShowProblem?problemid=a034

解題思路

在進入本題的討論之前,我們需要先了解何謂進位制。所謂的進位制,指的是以「基數」的指數和表示數字的記數方法。以最常見的十進位制來說,基數就是10。因此,以123這個數字來說,在十進位制下即為 1 x 102 + 2 x 101 + 3 x 100 。而所謂的二進位制,就是基數為2的進位制。除了基數不同以外,邏輯和十進位制其實相同。因此,在進行從十進位制到二進位制的轉換時,我們可以2的指數逐一降次檢查大小。

因為整數型態的變數可儲存的最大值為231,所以我們先從231開始檢查,若該數比231還大,就將該位數註記為1,並將其值減去231,否則將該位數註記為0。接著降次繼續檢查,直到整個數字檢查完畢,即完成二進位制的轉換。舉例來說,十進位制的123可以被表示為 1 x 26 + 1 x 25 + 1 x 24 + 1 x 23 + 0 x 22 + 1 x 21 + 1 x 20 ,因此其在二進位制表示法即為1111011。

注意事項

根據題意,測資檔會包含多組測資,因此需使用「EOF寫法」。所謂 EOF 並不是一種真實存在的字元,而是「End Of File」的縮寫,意思是一份檔案的結尾,也可以說是輸入的停止。通常程式在執行時會先讀取輸入,再依據輸入進行相對的行動,但我們未必能知道輸入有幾筆、到什麼時候結束,這時候我們就可以讓電腦自動偵測。一旦它偵測到EOF條件為True,即代表輸入停止,就會結束讀取輸入,如此我們的程式就不用事先指定輸入的筆數,可以不斷讀取輸入並執行直到輸入結束。

程式碼:C語言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
#define N 32
int main() {
// 宣告變數dec,代表輸入的十進位整數
int dec;
// 使用EOF寫法讀取每次輸入的dec值
while(scanf("%d", &dec) != EOF) {
// 宣告一維陣列bin,以陣列形式存放轉換後的二進位整數
int bin[N];
// 宣告變數digit,代表轉換後的二進位整數長度(位數)
int digit = 0;
// 要將十進位轉為二進位,可將其除以2
// 除以2後,得出的餘即為二進位的其中一位
// 繼續將商除以2,直到商為0為止,即可求出完整的二進位數字
while(dec) {
bin[digit] = dec%2;
dec /= 2;
digit++;
}
//輸出
for(int i = digit-1 ; i >= 0 ; i --)
printf("%d", bin[i]);
printf("\n");
}
return 0;
}