c语言给定两个 01字符串 a和 b,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1和 0。
时间: 2024-09-20 13:03:44 浏览: 96
在C语言中,我们可以使用字符数组来存储二进制字符串,然后通过遍历和位运算来计算两个字符串的和。以下是一个简单的示例函数,它实现了这个功能:
```c
#include <stdio.h>
#include <string.h>
// 函数用来将十进制数转换为二进制字符串并返回
char* int_to_binary(int num) {
char binary[32]; // 假设最大31位的整数
int i = 0;
while (num > 0) {
binary[i++] = num % 2 + '0'; // '+'操作使得结果为字符
num /= 2;
}
binary[i] = '\0'; // 添加字符串结束符
reverse(binary); // 反转字符串,因为低位在前
return binary;
}
// 反转字符串函数
void reverse(char *str) {
int start = 0, end = strlen(str) - 1;
while (start < end) {
char temp = str[start];
str[start] = str[end];
str[end] = temp;
start++;
end--;
}
}
// 计算两个二进制字符串之和
char* add_two_numbers(const char* a, const char* b) {
int len_a = strlen(a), len_b = strlen(b);
if (len_a < len_b) {
char temp[len_b + 1];
strcpy(temp, a);
a = temp;
len_a = strlen(a);
} else if (len_a > len_b) {
char temp[len_a + 1];
strcpy(temp, b);
b = temp;
len_b = strlen(b);
}
char result[len_a + 1]; // 结果字符串长度为两者长度较大者加1
int carry = 0; // 进位标志
for (int i = len_a - 1; i >= 0; i--) {
int sum = (a[i] - '0') + (b[i] - '0') + carry; // 字符转换为数值相加
result[i] = (sum % 2) + '0'; // 对应的二进制位
carry = sum / 2; // 更新进位
}
// 如果还有剩余的进位,将其转换为最高位
if (carry) {
result[0] = carry + '0';
}
// 翻转并添加字符串结束符
reverse(result);
result[strlen(result)] = '\0';
return result;
}
int main() {
char* a = "1101";
char* b = "1010";
char* sum = add_two_numbers(a, b);
printf("The sum of %s and %s in binary is: %s\n", a, b, sum);
free(sum); // 不要忘记释放内存
return 0;
}
```
当你运行这个程序,输入如`"1101"`和`"1010"`这样的字符串,它会输出它们的二进制和,例如`"10110"`。
阅读全文