>学习工控知识,就来工控小新
农历十一月二十六日 2024/1/ 7
往期推荐
2024年1月5日,每日花费一分钟练习C语言
2024年1月6日,每日花费一分钟练习C语言
每
日
一
练
/ Daily Exercises
C语言题目:二进制求和,给你两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字1和0
题目分析
题目要求我们给出两个二进制字符串,返回他们的和(用二进制表示)。输入为非空字符串且只包含数字1和0。这意味着我们需要考虑以下几个方面:
- 如何读取和存储二进制字符串?
-如何对齐两个二进制字符串,使得他们的长度相同?
-如何进行二进制加法运算,包括进位和溢出的处理?
- 如何输出二进制字符串的和?
接下来,我们来看看如何用C语言实现这个题目的解决方案。我们可以使用以下的步骤:
-定义一个常量MAX_LEN,表示二进制字符串的最大长度。我们可以根据题目的要求或者实际情况来设置这个值。为了简单起见,我们假设这个值为32。
-定义一个函数binary_sum,接受两个二进制字符串作为参数,返回一个二进制字符串作为结果。这个函数的原型如下:
char *binary_sum(char *a, char *b);
-在函数内部,我们需要定义一些变量,如两个二进制字符串的长度,一个进位标志,一个结果字符串,以及一个循环变量。我们可以使用以下的代码:
int len_a = strlen(a); // 获取第一个二进制字符串的长度int len_b = strlen(b); // 获取第二个二进制字符串的长度int carry = 0; // 初始化进位标志为0char *result = (char *)malloc(MAX_LEN + 1); // 分配一个结果字符串的空间,长度为MAX_LEN + 1,多出的一位用于存储'\0'字符int i; // 定义一个循环变量
-接下来,我们需要对齐两个二进制字符串,使得他们的长度相同。我们可以从右往左遍历两个字符串,如果某个字符串已经遍历完,就用0来补齐。我们可以使用以下的代码:
for (i = MAX_LEN - 1; i >= 0; i--) { // 从右往左遍历结果字符串的每一位 int bit_a = (len_a > 0) ? a[--len_a] - '0' : 0; // 获取第一个二进制字符串的当前位,如果已经遍历完,就用0代替,同时将其转换为整数 int bit_b = (len_b > 0) ? b[--len_b] - '0' : 0; // 获取第二个二进制字符串的当前位,如果已经遍历完,就用0代替,同时将其转换为整数
-然后,我们需要进行二进制加法运算,包括进位和溢出的处理。我们可以使用以下的公式来计算结果字符串的每一位:
result = (bit_a + bit_b + carry) % 2 + '0'; // 计算当前位的值,将其转换为字符carry = (bit_a + bit_b + carry) / 2; // 计算进位的值
-最后,我们需要输出二进制字符串的和。我们可以使用以下的代码
result[MAX_LEN] = '\0'; // 在结果字符串的末尾添加'\0'字符,表示字符串的结束return result; // 返回结果字符串
程序展示
根据上面的分析,我们可以用C语言来实现这个算法。
#include <stdio.h>#include <stdlib.h>#include <string.h>
#define MAX_LEN 32 // 定义二进制字符串的最大长度
char *binary_sum(char *a, char *b); // 声明二进制求和函数
int main() { char *a = (char *)malloc(MAX_LEN + 1); // 分配一个空间,用于存储第一个二进制字符串 char *b = (char *)malloc(MAX_LEN + 1); // 分配一个空间,用于存储第二个二进制字符串 printf("请输入第一个二进制字符串:\n"); // 提示用户输入第一个二进制字符串 scanf("%s", a); // 读取用户的输入 printf("请输入第二个二进制字符串:\n"); // 提示用户输入第二个二进制字符串 scanf("%s", b); // 读取用户的输入 if (strlen(a) == 0 || strlen(b) == 0) { // 检查输入是否为空字符串 printf("输入不能为空字符串!\n"); // 输出错误信息 return 1; // 结束程序 } size_t k; // 定义一个循环变量,类型为size_t for (k = 0; k < strlen(a); k++) { // 检查第一个二进制字符串是否只包含数字1和0 if (a[k] != '0' && a[k] != '1') { printf("输入只能包含数字1和0!\n"); // 输出错误信息 return 1; // 结束程序 } } for (k = 0; k < strlen(b); k++) { // 检查第二个二进制字符串是否只包含数字1和0 if (b[k] != '0' && b[k] != '1') { printf("输入只能包含数字1和0!\n"); // 输出错误信息 return 1; // 结束程序 } } char *c = binary_sum(a, b); // 调用二进制求和函数,得到结果字符串 //printf("%s + %s = %s\n", a, b, c); // 输出结果 int j = 0; // 定义一个变量,用于记录第一个不为0的位置 while (c[j] == '0' && j < MAX_LEN - 1) { // 循环找到第一个不为0的位置,如果全为0,就保留最后一位 j++; } printf("%s + %s = %s\n", a, b, c + j); // 从第一个不为0的位置开始打印结果 free(c); // 释放结果字符串的空间 return 0; // 结束程序}
char *binary_sum(char *a, char *b) { int len_a = strlen(a); // 获取第一个二进制字符串的长度 int len_b = strlen(b); // 获取第二个二进制字符串的长度 int carry = 0; // 初始化进位标志为0 char *result = (char *)malloc(MAX_LEN + 1); // 分配一个结果字符串的空间,长度为MAX_LEN + 1,多出的一位用于存储'\0'字符 int i; // 定义一个循环变量 for (i = MAX_LEN - 1; i >= 0; i--) { // 从右往左遍历结果字符串的每一位 int bit_a = (len_a > 0) ? a[--len_a] - '0' : 0; // 获取第一个二进制字符串的当前位,如果已经遍历完,就用0代替,同时将其转换为整数 int bit_b = (len_b > 0) ? b[--len_b] - '0' : 0; // 获取第二个二进制字符串的当前位,如果已经遍历完,就用0代替,同时将其转换为整数 result = (bit_a + bit_b + carry) % 2 + '0'; // 计算当前位的值,将其转换为字符 carry = (bit_a + bit_b + carry) / 2; // 计算进位的值 } result[MAX_LEN] = '\0'; // 在结果字符串的末尾添加'\0'字符,表示字符串的结束 return result; // 返回结果字符串}
程序测试
运行结果如下:
-这个结果与我们预期的一致,说明我们的程序是正确的。
源代码获取
#软件下载通道#
我用夸克网盘分享了「20240107」,点击链接即可保存。打开「夸克APP」,无需下载在线播放视频,畅享原画5倍速,支持电视投屏。
链接:https://pan.quark.cn/s/b50e6626ff24
(链接和提取码建议复制粘贴,手动输入容易出现错误)
| #支持一下#
分享整理,测试发布不易 如果您方便的话可以帮忙点一下↓↓
谢谢大家!
|
下期题目
给定两个整数 n和k,返回1...n中所有可能的个数的组合。
示例:
输入:n=4,k=2
输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]
点赞加关注,学习不迷路
微信公众号|工控小新
EPLAN电气绘图、TIA博图基础 、CAD、C语言教学、单片机基础、三菱PLC ... 每日持续更新中
发现“分享”和“赞”了吗,戳我看看吧
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |