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:])
