思路:
仿照竖式除法,首先让输入的待转换的数除以2,除得的余数是结果的最后一位,除得的商作为新的被除数循环进行前面的操作,依次从后向前地获取到转换结果的每一位。0或1作为被除数时结束循环,此时除得的商始终是0,可以以此为标识结束循环。
解答:
#include <cstdio>
#include <cstring>
using namespace std;
int main() {
char s[32]; // 字符数组s首先存放待转换的数字,后面用来存放每一次除以二得到的商
while (gets(s)) {
char result[100] = {};
int numsSize = 0; // numsSize表示转换结果的长度
int flag = 0; // flag指示是否除法是否算完了
// 输入除以二,商继续除以二,余数存入结果
do { //当十进制字符还未除完,即上一次循环中取到商非0,则继续循环
flag = 0; //每一次十进制字符串除以2都恢复0
// 每次循环处理一位数字
for (int i = 0; s[i]; i++) {
int digit = s[i] - '0'; // 目标位上的char转为int
int x = digit / 2; // 除以二取商
// 如果商不为0,则仍需要进行下一次除法,置flag为1
if(x != 0)
flag = 1;
// 竖式除法
if (s[i + 1]) { // 如果后一位上有数字
s[i + 1] += (digit % 2 * 10); // 除以2的余数*10并加入到下一位,下一次循环一起除
}
else { // 如果后一位上没有数字,即当前已经除到输入数字的最后一位,此时得到进制转换的结果的一位
result[numsSize++] = digit % 2 + '0'; // 最后一位除以2的余数就是进制转换的结果的一位,把它放入结果字符数组。同时通过累加numsSize获取转换结果的长度
}
s[i] = x + '0'; // 依次保存输入数字除以二的商的每一位
}
} while (flag);
//前面是从后往前得到结果的各位上的数,需要逆序打印
for (int k = numsSize - 1; k >= 0; k--) {
printf("%c", result[k]);
}
printf("\n");
}
return 0;
}
坑:
过程有点复杂
参考:
https://blog.csdn.net/myRealization/article/details/80154726