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。

注意事項

雖然並不常見,但只要符合寫法,迴圈可以同時使用多個控制變數。本程式碼內中的for迴圈就用了兩個變數控制迴圈運行,其中變數n代表的是檢查的次方,i代表的是轉換為二進位後的位數。

程式碼: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
27
28
#include <stdio.h>
#include <math.h>
int main() {
//宣告變數dec,表示十進位數字
int dec;
while(scanf("%d", &dec) != EOF) {
int bin[32] = {}, non_zero_digit = 0;
//從22<sup>31</sup>開始檢查,次方逐次遞減
for(int n = 31, i = 0 ; n >= 0 ; n--, i++) {
//若該數大於等於2<sup>n</sup>,就將該位數註記為1,並將其值減去2<sup>n</sup>
if(dec >= pow(2, n)) {
bin[i] = 1;
dec -=pow(2, n);
non_zero_digit++;
}
//若該數小於2<sup>n</sup>,就將該位數註記為0
else
bin[i] = 0;
//輸出須注意該位數為0的可能有兩種
//若前面沒有輸出過非0數字,則為前綴零,不輸出
//若否,則為非前綴零,需輸出
if(bin[i] != 0 || non_zero_digit != 0)
printf("%d", bin[i]);
}
printf("\n");
}
return 0;
}