演算法筆記 — 進位制轉換(大數運算-十進位制轉二進位制)
阿新 • • 發佈:2018-11-25
題目連結:http://www.codeup.cn/problem.php?cid=100000579&pid=2
題目描述
將一個長度最多為30位數字的十進位制非負整數轉換為二進位制數輸出。
輸入
多組資料,每行為一個長度不超過30位的十進位制非負整數。
(注意是10進位制數字的個數可能有30個,而非30bits的整數)
輸出
每行輸出對應的二進位制數。
樣例輸入
985
211
1126
樣例輸出
1111011001
11010011
10001100110
大數以字串的形式輸入,轉化為每位的數字形式,先判斷是否為0,如果為0直接輸出0.
在while(1)迴圈中,如果數字變為0結束迴圈;將對個位數字取餘的結果放到陣列中儲存,再通過for迴圈將這個大數除以2(例如541/2→5/2=2
我真的被自己菜哭了。。。
#include<iostream> #include<cstring> using namespace std; typedef long long ll; char ss[33]; int s[33]; char ans[1111]; int main(){ while(cin>>ss){ int len=strlen(ss); int cnt=0; for(int i=0;i<len;i++){ s[i]=ss[i]-'0'; } //如果輸入數字為0,則輸出0 bool f=1; for(int i=0;i<len;i++){ if(s[i]){ f=0; break; } } if(f){ cout<<"0"<<endl; continue; } while(1){ //數字為0,迴圈結束 bool flag=1; for(int i=0;i<len;i++){ if(s[i]){ flag=0; break; } } if(flag){ break; } //存最後一位對2取模 ans[cnt++]=s[len-1]%2+'0'; //大數除以2 for(int i=0;i<=len-1;i++){ if(s[i]%2==1){ s[i]/=2; s[i+1]+=10; } else{ s[i]/=2; } } } for(int i=cnt-1;i>=0;i--){ cout<<ans[i]; } cout<<endl; } return 0; }