int divide_by_2(char *num) {
int len = strlen(num);
int carry = 0; // 进位
for (int i = 0; i < len; i++) {
int cur = carry * 10 + (num[i] - '0');
num[i] = (cur / 2) + '0'; // 商覆盖原数字
carry = cur % 2; // 新的进位
}
// 去掉结果的前导零(例如 "086" -> "86")
int start = 0;
while (start < len && num[start] == '0') start++;
if (start == len) {
num[0] = '0';
num[1] = '\0';
} else {
memmove(num, num + start, len - start + 1);//目标地址:num源地址:num + start复制字节数:len - start + 1
}
return carry; // 余数即为二进制位
}
int main() {
char dec[1010];
while (scanf("%s", dec) != EOF) {
char bin_rev[4000]; // 存放逆序二进制
int idx = 0;
// 处理输入为 "0" 的情况
if (dec[0] == '0' && dec[1] == '\0') {
printf("0\n");
continue;
}
while (1) {
// 如果当前数字已经是 "0",结束
if (dec[0] == '0' && dec[1] == '\0') break;
// 模拟除以2,得到余数
int r = divide_by_2(dec); // dec 在函数中被更新为商
bin_rev[idx++] = r + '0'; // 记录余数(逆序二进制位)
}
bin_rev[idx] = '\0';
// 此时 bin_rev 就是原二进制逆序后的字符串,例如 "10110101"
// 后续还需要将 bin_rev 转换成十进制大数(这一步省略,但可类似模拟)
int bin_rev_to_dec(char *bin_rev) {
int len = strlen(bin_rev);
int sum = 0;
for (int i = len - 1, j = 0; i >= 0; i--, j++) {
if (bin_rev[j] == '1') {
sum += 1 << i; // 用左移代替 pow(2,i)
}
}
return sum;
}
登录后发布评论
1.int(x,base):将x转化为base进制的整数,base为2/10/.../36
2.format(x,y):将x转化为y进制的字符串,y为'b'/'o'/'d'/'x',分别对应二,八,十,十六进制
3.python的int型无上限,不会对精度产生影响;c语言的int最多64位
4.C语言需要把输入的字符串存入字符串数组,并在字符串数组中模拟手动除法计算十进制一次除法余数
int divide_by_2(char *num) { int len = strlen(num); int carry = 0; // 进位 for (int i = 0; i < len; i++) { int cur = carry * 10 + (num[i] - '0'); num[i] = (cur / 2) + '0'; // 商覆盖原数字 carry = cur % 2; // 新的进位 } // 去掉结果的前导零(例如 "086" -> "86") int start = 0; while (start < len && num[start] == '0') start++; if (start == len) { num[0] = '0'; num[1] = '\0'; } else { memmove(num, num + start, len - start + 1);//目标地址:num源地址:num + start复制字节数:len - start + 1} return carry; // 余数即为二进制位 }int main() { char dec[1010]; while (scanf("%s", dec) != EOF) { char bin_rev[4000]; // 存放逆序二进制 int idx = 0; // 处理输入为 "0" 的情况 if (dec[0] == '0' && dec[1] == '\0') { printf("0\n"); continue; } while (1) { // 如果当前数字已经是 "0",结束 if (dec[0] == '0' && dec[1] == '\0') break; // 模拟除以2,得到余数 int r = divide_by_2(dec); // dec 在函数中被更新为商 bin_rev[idx++] = r + '0'; // 记录余数(逆序二进制位) } bin_rev[idx] = '\0'; // 此时 bin_rev 就是原二进制逆序后的字符串,例如 "10110101" // 后续还需要将 bin_rev 转换成十进制大数(这一步省略,但可类似模拟)int bin_rev_to_dec(char *bin_rev) { int len = strlen(bin_rev); int sum = 0; for (int i = len - 1, j = 0; i >= 0; i--, j++) { if (bin_rev[j] == '1') { sum += 1 << i; // 用左移代替 pow(2,i) } } return sum; }//1 << i等于2的i次幂printf("逆序二进制:%s\n", bin_rev); // 此处仅演示,实际应输出十进制逆序数 } return 0; }