[西门子] 2024年1月7日,每日花费一分钟练习C语言

[复制链接]
查看303 | 回复0 | 2024-6-28 08:07:06 | 显示全部楼层 |阅读模式
>学习工控知识,就来工控小新


农历十一月二十六日   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 ... 每日持续更新中


发现“分享”“赞”了吗,戳我看看吧


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则