1. 程式人生 > >演算法筆記 — 進位制轉換(大數運算-十進位制轉二進位制)

演算法筆記 — 進位制轉換(大數運算-十進位制轉二進位制)

 

題目連結: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

...1→(2*10+4)/2=7→→541/2的結果為270餘1)

我真的被自己菜哭了。。。

#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;
}