a034: 二進位制轉換

2022.12.05 PM 09:30 by CBJ

來源 : https://zerojudge.tw/ShowProblem?problemid=a034
出題者 : jiangsir
標籤 : 遞迴(迴圈)、bitset、bin()
難易度 : 2
解題想法 : 

。C - 遞迴
(若不知道十進位如何轉成二進位,可參考 http://www.chwa.com.tw/TResource/VS/book1/ch2/2-5.htm )

首先,定義一個函式to_binary(),用來遞迴計算某十進位n轉成二進位的數值。

根據轉換法,轉換的終止條件為當 n=0 時,故將n=0訂為遞迴的終止。

再來應該繼續呼叫to_binary(n/2)還是先輸出n%2呢?因為計算出的答案是從後面取回來,所以我們不妨先繼續遞迴,直到遞迴結束回傳時再輸出n%2,這樣一來就達成了先執行後輸出的效果,也不需要再另外多開空間儲存。

。C++ - bitset
bitset是一個二進制的儲存容器,資料從右放至左(bitset[0]為最右邊的值),因為支援繼承數值,所以此題可以使用bitset來做。

直接像下面這樣把6丟進bitset就完成了轉二進位 :
bitset<32(儲存空間)>bs(6);
cout << bs;

輸出後的結果會出現 00000000000000000000000000000110,並不是我們想看到的結果,因為我們並不需要前面那些0。很直覺的解決方法就是多一行判斷,假如是0就跳過,是1就輸出,但是輸出的結果就會變成11,連110的0都給跳過了。

因此我們可以換個想法,從左邊數到右邊,只要遇到一個1,以後不管是0還是1都把它輸出,即可符合我們的結果,實作上可以跑一個for i迴圈遍歷,但切記因為最右邊才是第0個,所以我們的i會是從bitset的大小-1遞減回去到0。

另外還需要多一個bool判斷是否遇到第一個1,假如一遇到就將bool設為true,之後只要bool為true就輸出。

。Python - bin()
bin()可以直接將一個數值轉為二進位,但回傳的字串前面會多出現一個0b,例如bin(3)會回傳'0b11',因為我們只需要後面的11,所以可以利用[2:]的語法只取第二位(含)之後的字串。(從0開始算)
//C language

#include<stdio.h>
void to_binary(int n){
    if(n==0)return;
    to_binary(n/2);
    printf("%d",n%2);
}
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        to_binary(n);
        printf("\n");
    }
    return 0;
}
//C++ language

#include<iostream>
#include<bitset> //bitset
using namespace std;
int main(){
    int n;
    while(cin>>n){
        bitset<32>ans(n);
        bool flag=false;
        for(int i=31;i>=0;i--){
            if(ans[i]) flag=true;
            if(flag) cout<<ans[i];
        }
        cout<<"\n";
    }
    return 0;
}
## Python language

from sys import stdin
for read in stdin:
    n=int(read)
    print(bin(n)[2:])

相關文章