【刷题】二进制求和

news2025/1/10 20:37:06

        当你觉得小学二年级教的的竖式学会了以后,此题又是一记重击。

目录

前言

一、题目

二、找规律

三、思想

1.位数相同

2.位数不同

3.注意事项 

四、具体实现

总结


前言

        同上次做过的的二进制求和相似(按位异或求出的是无进位和,按位与求出的是进位,将两数加到进位为0为止),此题也是列竖式的方式求解,不过不同的是,这道题是以字符串的形式出现的两个数字,需要将每一位单独分出来找规律。


一、题目

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"
  • 1 <= a.length, b.length <= 10^4
  • a 和 b 仅由字符 '0' 或 '1' 组成
  • 字符串如果不是 "0" ,就不含前导零

二、找规律

        直接上图吧: 

三、思想

        主要考虑几种情况:

1.位数相同

        这种不需要特别考虑,就按照上图的进位规律相加即可。

2.位数不同

        这种需要对于位数少的进行添加0来保证下一步的正常相加。

代码如下(示例):

    for (i = 0; i < len; i++)
	{
        //短数进行加0
		int ia = (i < strlen(a) ? (a[i] - '0') : 0);
		int ib = (i < strlen(b) ? (b[i] - '0') : 0);
		
		carry += ia;
		carry += ib;
		ans[count++] = carry % 2 + '0';
		carry /= 2;
	}

3.注意事项 

        特别注意的是:因为“列竖式”的方式是从低位开始,但是我们只能从高位开始取(当然,也可以用指针或者下标控制着往前遍历,但是不方便,亲测!),所以需要对于初始的两个数进行翻转。

代码如下(示例):

void reverse(char* a)
{
	char* left = a;
	char* right = a + strlen(a) - 1;
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

四、具体实现

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void reverse(char* a)
{
	char* left = a;
	char* right = a + strlen(a) - 1;
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

int main()
{
	char a[] = "1011";
	char b[] = "1011";
	
	reverse(a);
	reverse(b);
	// 进位
	int carry = 0;
	int i = 0;
	size_t len = strlen(a) > strlen(b) ? strlen(a) : strlen(b);
	// 一位给进位,一位给'\0'
	char* ans = (char*)malloc(sizeof(char) * len + 2);
	// 给ans计位
	int count = 0;
	for (i = 0; i < len; i++)
	{
		int ia = (i < strlen(a) ? (a[i] - '0') : 0);
		int ib = (i < strlen(b) ? (b[i] - '0') : 0);
		
		carry += ia;
		carry += ib;
		ans[count++] = carry % 2 + '0';
		carry /= 2;
	}
	// 进位没进完
	if (carry > 0)
	{
		ans[count++] = '1';
	}
	// 进位被进完不用管
	// 末尾加上'\0'
	ans[count] = '\0';
	reverse(ans);
	printf("%s", ans);
	return 0;
}

总结

        从小学二年级开始学的四大运算总会给你新的惊喜,这就需要我有扎实的数理基础,而不仅仅是会算,更要知其所以如此“算”。

        需要熟练掌握:进位和与本位和的基础知识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术架构(组件)14——Hive:掩码函数杂项函数

1.4.8、掩码函数1.4.8.1、mask-->Hive2.1.01.4.8.12、mask_first_n->Hive2.1.01.4.8.13、mask_last_n -->Hive2.1.01.4.8.14、mask_show_first_n-->Hive2.1.01.4.8.15、mask_show_last_n -->Hive2.1.01.4.8.16、mask_hash -->Hive2.1.0支持版本返回值类型函数…

让你深夜emo的“网抑云”,是如何做产品设计的?

网易云音乐作为国内首个以“歌单”为核心架构的音乐APP&#xff0c;有的人喜欢它的热评&#xff0c;有的人却觉得它的版权太少&#xff0c;虽然网易云音乐不是曲库最丰富的听歌软件&#xff0c;但绝对是听歌软件里情感体验最好的。 我很好奇它具有什么力量&#xff0c;能够使用…

ReentrantReadWriteLock可重入读写锁

目录 读写锁&#xff1a; 锁降级 锁饥饿&#xff1a; 读写锁&#xff1a; 定义&#xff1a;一个资源能够被多个读线程访问&#xff0c;或者被一个写线程访问&#xff0c;但是不能同时存在读写线程。 特点:读写互斥&#xff0c;写锁独占&#xff0c;读读可共享,读没有完…

分布式学习第三天—远程调用和网关

Feign远程调用 Feign的介绍 Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送 Feign远程调用的使用步骤 1.引入依赖 在子模型服务的pom文件中引入feign的依赖&#xff1a; &l…

【计网】入门知识

一些基本认识网络传输基本要素&#xff1a;网络编程&#xff1a;python的网络编程方式TCP和UDP一些编程技巧socket实现TCP通信网络传输基本要素&#xff1a; 有连接通道、传输字节数据、输入输出遵守一样的协议 网络编程&#xff1a; CS&#xff08;QQ下载客户端&#xff09…

linux防火墙究竟如何使用?iptables的原理与简单应用

1. 什么是防火墙&#xff1f; 在计算机体系中&#xff0c;防火墙是基于预定安全规则来监视和控制传入和传出网络流量的网络安全系统。该计算机流入流出的所有网络通信均要经过此防火墙。防火墙对流经它的网络通信进行扫描&#xff0c;这样能够过滤掉一些攻击&#xff0c;以免其…

Vulkan 理解Vertex Input Description

此文为个人记录&#xff0c;感兴趣直接看https://zhuanlan.zhihu.com/p/450157594 首先&#xff0c;一个顶点的结构体 struct Vertex {glm::vec3 pos;glm::vec3 color; }CPU端给出顶点数据 const std::vector<Vertex> vertices {{{0.0f, -0.5f}, {1.0f, 0.0f, 0.0f}},…

Allegro如何显示盲埋孔钻孔所在层面操作指导

Allegro如何显示盲埋孔钻孔所在层面操作指导 在用Allegro做PCB设计的时候,涉及盲埋孔设计的时候,需要实时看到盲埋孔是打在哪层到哪层,如下图 实时显示了盲埋孔是从哪层到哪层的,比如1-3,3-6等等 如何显示,具体操作如下 选择Setup选择design Parameters

[golang Web开发] 3.golang web开发:处理请求

简介 Go语音的net/http包提供了一系列用于表示HTTP报文的结构,可以使用它处理请求和发送响应,其中Request结构代表了客户端发送的请求报文,下面是Request讲解 type Request struct {// Method指定HTTP方法&#xff08;GET、POST、PUT等&#xff09;。对客户端&#xff0c;"…

linux系统加固

linux安全加固 linux系统安全包括用户安全、权限安全、文件安全 从那些方面进行加固 身份鉴别 访问控制 安全审计 资源控制 入侵防范 在linux当中一切皆文件 身份鉴别 /etc/login.defs 文件功能 查看密码策略 /etc/login.defs文件定义了与/etc/passwd和/etc/shadow配套的用户限…

VOIP创建

一、介绍VOIP的推送证书的创建方式和普通的证书的创建方式基本一致。二、步骤首先需要生成证书签名的请求文件CerSingingRequest&#xff0c;打开钥匙串应用&#xff0c;点击钥匙串访问->证书助理->从证书颁发机构请求输入电子邮件和名称后保存到本地3.在developer.apple…

服务器防火墙 配置端口号

作为前端的我头次做运维的事情。 现在服务器是的默认端口好像只有80&#xff0c;443&#xff0c;其余端口都需要我们配置 域ping 通了&#xff0c;以为服务配置好了可以撸起袖子加油干&#xff0c;但是 访问公司的服务 出错了400 访问公司的服务xxx.168.30.xxx:8081&#xff…

【字符串】leetcode344.反转字符串(C/C++/Java/Python/Js)

leetcode344.反转字符串1 题目2 思路3 代码3.1 C版本3.2 C版本3.3 Java版本3.4 Python版本3.5 JavaScript版本4 总结打基础的时候&#xff0c;不要太迷恋于库函数。 1 题目 题源链接 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给…

国内最新餐饮品牌全案设计十大排名(2023年榜单)

餐饮全案设计是餐饮店经营过程之前的重要一步&#xff0c;想要打造一家特色餐饮店并不是一件简单的事。一来要满足功能性需求的同时还具有一定的审美性&#xff1b;二来既要尽可能高地提升空间利用率让顾客消费体验愉悦和服务员工作效率高&#xff0c;能够展现餐厅的主题和文化…

分布式锁原理及Redis如何实现分布式锁

一淘模板给大家带来了关于redis的相关知识&#xff0c;其中主要介绍了关于分布式锁是什么&#xff1f;Redis又是怎么实现分布式锁的&#xff1f;需要满足什么条件&#xff1f;下面一起来看一下吧&#xff0c;希望对需要的朋友有帮助。 一、分布式锁基本原理 分布式锁&#xff…

PTA L1-027 出租(详解)

前言&#xff1a;本期是关于出租的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救…

【python学习笔记】:数据科学库操作(三)

接上一篇&#xff1a; 14、Pandas Pandas 是一个快速、强大、灵活且易于使用的开源数据分析和操作工具&#xff0c; Pandas 可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据&#xff0c;可以对各种数据进行运算操作&#xff0c;比如归并、再成形、选择&#…

SockJS-client简介

概述 SockJS是一个浏览器JavaScript库&#xff0c;提供了一个类似websocket的对象。SockJS为您提供了一个连贯的&#xff0c;跨浏览器的Javascript API&#xff0c;它在浏览器和web服务器之间创建了一个低延迟&#xff0c;全双工&#xff0c;跨域通信通道。 实际上&#xff0…