3:十進位制數轉二進位制數(類似大整數除法)
阿新 • • 發佈:2019-02-18
題目連結:http://dsalgo.openjudge.cn/huawen02/3/
題目大意就是將十進位制數轉換成二進位制,難就難在十進位制數的位數小於100位。
這就意味著不能用任意型別來存,只能用陣列來存。
十進位制轉二進位制十進位制轉二進位制 十進位制整數轉換為二進位制整數採用"除2取餘,逆序排列"法。 具體做法是:用2整除十進位制整數,可以得到一個商和餘數;再用2去除商,又會得到一個商和餘數,如此進行,直到商為0時為止,然後把先得到的餘數作為二進位制數的低位有效位,後得到的餘數作為二進位制數的高位有效位,依次排列起來。
根據轉換規則直接就能聯想到大整數的除法,但這又比傳統大整數的除法要簡單,因為它的除數固定是2。
1. 對stu陣列每一位 /2 得到新的被除數的對應位置的數字。
2. 當 i!= len-1 時,就要計算下一位是否需要 加上(前一位對2取餘,再乘上10)。
3. 當 i == len-1 時, 意味著被除數到了最後一位了,就可以直接對2取餘,得到result的相應位置的結果。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; char stu[101]; char result[1000]; int len; int main() { while(~scanf("%s",stu)) { len = strlen(stu); int beichushu_weiling = 1; int k=0; while(beichushu_weiling) { beichushu_weiling=0; for(int i=0;i<len; ++i) { //檢查除的結果是否為0 int linshi_beichushu = (stu[i]-'0')/2; if(linshi_beichushu) beichushu_weiling=1; if(i==len-1) { //當是被除數最後一位時,就能直接得出餘數是多少 result[k++] = (stu[i]-'0')%2+'0'; } else { //一定要記住前一位的餘數加到後一位,需要乘上10 stu[i+1] = (stu[i]-'0')%2*10+stu[i+1]; } //用來得到新的被除數stu stu[i] = linshi_beichushu+'0'; } } result[k]='\0'; //result的結果需要調轉順序 for(int i=0,j=k-1; i<j; i++,j--) { char temp = result[i]; result[i] = result[j]; result[j] = temp; } printf("%s\n",result); } return 0; }