学习工控知识,就来工控小新
农历十一月二十六日 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; // 初始化进位标志为0
char *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[i] = (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[i] = (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 ... 每日持续更新中