1. 程式人生 > >3:十進位制數轉二進位制數(類似大整數除法)

3:十進位制數轉二進位制數(類似大整數除法)

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