进制转换:
思路:
1、十进制非负整数转二进制采取的方法是“除二取余,逆序排列”的方法。
2、关于取余,我们可以把十进制数的最后一位取余结果作为每一轮的余数;关于被除数,我们需要把十进制除以二的结果作为新的被除数。
3、若这道题的整数是20位以内的,我们可以用long long变量存储十进制数就可以简单做出来了,但是题目是30位整数,那么就得考虑用字符串来保存十进制数。
4、问题的难点就是,我们怎么在字符串中做除法,使得结果和整数做除法的结果一样?
模拟一遍手工做除法,我们可以这样在字符串中做除法:
dec[i+1]=(dec[i]%2)*10+dec[i+1]
dec[i]=dec[i]/2
5、按照这个思路,每一轮我们都对被除数取余,除以二;接着判断新的被除数是否为0,若是则进制转换结束。

#include<iostream>
#include<string>
using namespace std;

int main()
{
    string dec;
    int *num = (int *)malloc(sizeof(int) * 31);
    for (int i = 0; i < 31; ++i) 
        num[i] = -1;
    int l;
    while (cin >> dec)
    {
        l = dec.length();
        int *p = (int *)malloc(sizeof(int)*l * 4);//二进制数组
        for (int i = 0; i < l; ++i) //十进制数组复制赋值
            num[i] = dec[i] - '0';
        int remain, sum, turn = 0;
        do {
            sum = 0;//判断被除数是否为0
            remain = num[l - 1] % 2;
            p[turn++] = remain;//把这一轮的余数存进二进制数组
            for (int i = 0; i < l; ++i) {
                num[i + 1] += (num[i] - ((num[i] >> 1) << 1)) * 10;
                num[i] >>= 1;
                if (num[i] != 0)
                    sum = 1;//只要被除数有一位不是0,那么被除数就不是0
            }
        } while (sum != 0);
        for (int i = turn-1; i >=0; --i)
            cout << p[i];
    }

    return 0;
}