思路:
仿照豎式除法,首先讓輸入的待轉換的數除以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