进制转换:
思路:
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; }