九日集训 Leetcode 371.两整数之和

给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。

示例 1:

输入:a = 1, b = 2
输出:3

示例 2:

输入:a = 2, b = 3
输出:5

提示:

  • -1000 <= a, b <= 1000

一、信息

1.给我两个整数

2.不使用+和-号

3.计算两整数之和

二、步骤

第一步 申请两个整型变量

第二步 输入两个整数并赋值给这两个整型变量

第三步 return 即可

三、分析

问题出现:

问题1:题目中告诉我们不能用+和-那我们该怎么运算呢?

思考:

首先我们先来回忆一下记忆空间中哪些加法的实现可以不用+-,我能想到的第一个就是二进制加法这在计算机组成原理设计加法器中就有所体现。

那我们先观察一下二级进制加法的特点以便提取其中的规律

  1 1 0 1(13)

+1 0 1 0(10)

——————

1 0 1 1 1(23) 

不难看出二进制的加法实则就是异或运算

但是又有不同因为加法有时会进位那么新的问题就出现了其次二进制中可没有正负号,而且负数的加法又该怎么设计呢?这样又要引入反码和补码,又一个问题出现


问题2:该如何解决进位问题?

通过移位运算符,问题又出现了,移位运算符该怎么用呢?问题三解决了。那么接下来就要解决这个问题了。

目前确定两种思路:

思路一 直接异或

是直接异或在异或的过程中记录进了多少位

思路二 模拟

就是一位一位的进位模拟这样的好处是省去了思考难度直接根据平时计算的习惯,算一位然后检查是否进位,如果进位那么下一位在异或的时候就要在异或进位的数,直接通过循环控制

问题3: 位运算符怎么用

 我的这篇文章有讲解

答案:

 传送门:4.8 位运算符

问题四 :该如何解决负数的问题引入符号位吗?

 存储的数据结构:

思路一:我觉得由于这个实现的机制我们可以把它先存在一个整型变量中

思路二:一位一位的存我认为最直观的还是存在一列数组里面

答案:

我的答案:

我们可以使用位运算来实现这个功能。下面是基本思路:

1. **无进位和**:进行异或运算。
2. **进位**:进行与运算,并左移一位。
3. 将无进位和与进位相加,即重复上述两步,直到进位为0。

### C语言实现

#include <stdio.h>int getSum(int a, int b) {while(b != 0) {unsigned int carry = (unsigned int)(a & b) << 1; // 计算进位a = a ^ b; // 计算无进位和b = carry; // 更新进位}return a;
}int main() {printf("%d\n", getSum(1, 2)); // 输出3printf("%d\n", getSum(2, 3)); // 输出5return 0;
}

### C++实现

#include <iostream>class Solution {
public:int getSum(int a, int b) {while (b != 0) {unsigned int carry = (unsigned int)(a & b) << 1; // 计算进位a = a ^ b; // 计算无进位和b = carry; // 更新进位}return a;}
};int main() {Solution solution;std::cout << solution.getSum(1, 2) << std::endl; // 输出3std::cout << solution.getSum(2, 3) << std::endl; // 输出5return 0;
}

### Java实现

public class Solution {public int getSum(int a, int b) {while (b != 0) {int carry = (a & b) << 1; // 计算进位a = a ^ b; // 计算无进位和b = carry; // 更新进位}return a;}public static void main(String[] args) {Solution solution = new Solution();System.out.println(solution.getSum(1, 2)); // 输出3System.out.println(solution.getSum(2, 3)); // 输出5}
}

### 分析过程

1. **异或运算**:异或运算可以得到两个整数的无进位和。例如,对于二进制数`1101`和`1001`,其无进位和为`0100`。

2. **与运算**:与运算可以得到两个整数的进位。例如,对于二进制数`1101`和`1001`,其进位为`1001`。

3. **左移运算**:左移一位可以得到进位后的值。例如,`1001`左移一位为`10010`。

4. **循环**:将无进位和与进位相加,即重复上述三个步骤,直到进位为0。这是因为每一次无进位和与进位相加,都可能产生新的进位。当进位为0时,无进位和即为两数之和。

这个方法可以避免使用加法和减法运算符,仅通过位运算实现两整数的加法。

英雄师傅的答案:

int getSum(int a, int b){return a+b;
}

大师点评 

你的思考过程很详细,也很清晰。你已经考虑到了二进制加法中的各种问题,例如进位和负数表示。下面是对你的思考过程的一些补充和澄清。

### 1. 异或运算和进位
你已经注意到了,二进制加法可以通过异或运算来得到无进位和,这一点是非常正确的。同时,你也提到了进位的问题,这也是非常关键的一点。通过与运算和左移运算,我们可以得到进位。

### 2. 负数和补码
对于负数,计算机中通常使用补码来表示。补码就是反码加1。所以,我们不需要特别处理负数,因为补码的形式允许我们使用相同的加法规则来处理正数和负数。

### 3. 位运算符
位运算符在这里非常有用。你提到了异或运算符`^`,与运算符`&`,和左移运算符`<<`。这些都是实现二进制加法所必需的。

### 4. 存储
你提到了两种存储思路,一种是直接存储在整型变量中,另一种是一位一位地存储在数组中。实际上,直接存储在整型变量中就足够了,因为我们可以通过位运算来访问和操作整数的每一位。

### 5. 实现
根据上述分析,我们可以直接使用整型变量来存储输入的整数,然后通过位运算来实现二进制加法。我们不需要特别处理负数,也不需要一位一位地存储整数。我们可以直接在整型变量上进行位运算,得到最终的结果。

你的思考过程已经非常接近最终的解决方案了,只需要将这些思考整合到代码中,就可以实现题目要求的功能。

总结:

从这道题目中,我们可以学到以下几点:

### 1. **位运算的应用**
这道题目教会我们如何使用位运算来实现整数加法,这是一种基础但非常重要的技能。通过这道题,我们学会了如何使用异或运算来计算无进位和,如何使用与运算和左移运算来计算进位。

### 2. **二进制加法原理**
这道题目涉及到了二进制加法的基本原理,包括无进位和和进位。通过实现这个算法,我们加深了对二进制加法原理的理解。

### 3. **计算机中的整数表示**
这道题目还涉及到了计算机中整数的表示方法,特别是负数的补码表示。通过这道题,我们可以更好地理解计算机中整数是如何存储和表示的。

### 4. **算法设计**
这道题目需要我们设计一个算法来模拟整数加法的过程。这是一种基础的算法设计问题,通过解决这个问题,我们可以提高我们的算法设计能力。

### 5. **编程实践**
实现这个算法需要编写代码,这是一种很好的编程实践。通过编写代码来实现算法,我们可以提高我们的编程能力。

### 6. **问题分析和解决**
这道题目要求我们不使用加法和减法运算符来实现加法,这是一个有约束的问题。通过分析和解决这种有约束的问题,我们可以学会如何在一定的约束条件下思考问题和寻找解决方案。

### 7. **细节处理**
在实现这个算法的过程中,我们需要考虑各种细节,例如进位的处理,负数的处理等。这教会我们在设计算法和编写代码时要注意细节。

### 总结
这道题目是一个很好的学习机会,它涉及到了位运算、二进制加法原理、整数表示、算法设计、编程实践、问题分析和解决等多个方面。通过学习和实践,我们可以在这些方面得到提高。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能生活从这里开始:数字孪生驱动的社区

数字孪生技术&#xff0c;这个近年来备受瞩目的名词&#xff0c;正迅速渗透到社区发展领域&#xff0c;改变着我们居住的方式、管理的方式以及与周围环境互动的方式。它不仅仅是一种概念&#xff0c;更是一种变革&#xff0c;下面我们将探讨数字孪生技术如何推动社区智能化发展…

力扣-169. 多数元素(C语言+分治递归)

1. 题目 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 2. 输入输出样例 示例1 输入&#xff1a;nums [3,2,3] 输出&#xff…

代码随想录算法训练营第四十九天 | 动态规划 part 10 | 买卖股票的最佳时机i、ii

目录 121. 买卖股票的最佳时机思路代码 122.买卖股票的最佳时机II思路代码 121. 买卖股票的最佳时机 Leetcode 思路 贪心&#xff1a;记录最低值&#xff0c;并且遍历股票逐个寻找股票卖出最大值 动态规划&#xff1a; dp[i][0] 表示第i天持有股票所得最多现金 dp[i][1] 表示…

黎明加水印微信小程序源码 支持流量主接入

黎明加水印微信小程序源码&#xff0c;支持流量主接入。支持从聊天记录选择文件、相机拍摄、直接选择文件 支持白底、黑底的隐形水印&#xff0c;制作后&#xff0c;通过增加蒙版方能看到水印 纯前端&#xff0c;可嵌入任何项目。 部署教程 1、解压后得到项目文件夹 3、把…

什么才是物联网领域最好的开发语言?

什么才是物联网领域最好的开发语言&#xff1f; 最好&#xff01;运行最快&#xff1f;开发最高效&#xff1f;最容易学习&#xff1f; 各有特点&#xff01; 采用C/C语言&#xff0c;运行最快&#xff0c;一般采用厂家提供的底层驱动支持包BSP&#xff0c;所有MCU都支持。如…

华为OD机考算法题:最小数量线段覆盖

目录 题目部分 解读与分析 代码实现 题目部分 题目最小数量线段覆盖难度难题目说明给定坐标轴&#xff08;一维坐标轴&#xff09;上的一组线段&#xff0c;线段的起点和终点均为整数并且长度不小于1&#xff0c;请你从中找到最少数量的线段&#xff0c;这些线段可以覆盖住…

【从0学习Solidity】36. 默克尔树 Merkle Tree

【从0学习Solidity】36. 默克尔树 Merkle Tree 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xf…

通俗易懂-OpenCV角点检测算法(Harris、Shi-Tomas算法实现)

目录 1 图像的特征 2&#xff0c;Harris角点检测 2.1 代码实现 2.2结果展示 3&#xff0c;Shi-Tomasi角点检测算法 3.1 &#xff0c; 代码实现 3.2结果展示 1 图像的特征 2&#xff0c;Harris角点检测 、 2.1 代码实现 import cv2 as cv import matplotlib.pyplot as …

QFrame类学习笔记

1、QFrame的作用 QFrame类继承于QWidget类&#xff0c;被QAbstractScrollArea, QLabel, QLCDNumber, QSplitter, QStackedWidget, and QToolBox等类继承。 QFrame作为许多基础控件的基类&#xff0c;提供许多成员方法给子类&#xff0c;实现子类的框架样式的设计。框架样式主要…

基于微信小程序的健身小助手打卡预约教学系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;用户的功能设计为&#xff1a;管理员的功能设计为&#xff1a;健身房的功能设计为&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获…

【数据结构】插入排序:直接插入排序、折半插入排序、希尔排序的学习知识总结

目录 1、排序的基本概念 2、直接插入排序 2.1 算法思想 2.2 代码实现 3、折半插入排序 3.1 算法思想 3.2 代码实现 4、希尔排序 4.1 算法思想 4..2 代码实现 1、排序的基本概念 排序是将一组数据按照预定的顺序排列的过程&#xff0c;排序的基本概念包括以下内容…

electron快速入门

新建electronstu01文件夹 以管理员身份运行powershell&#xff0c;切换到该文件下 npm init -y安装依赖包 npm install --save-dev electron失败 npm install -g cnpm --registryhttps://registry.npm.taobao.org cnpm install --save-dev electron修改 package.json &qu…

正则表达式的应用(前端写法)

文章目录 1、匹配字符串中&#xff0c;a标签的href值2、校验邮箱3、校验手机号码3、待添加... 1、匹配字符串中&#xff0c;a标签的href值 (1) 代码 /*** description 匹配字符串中&#xff0c;a标签的href值* param {string} str 匹配的字符串* return {Array} 返回href值*/…

冒泡排序与选择排序(最low的两兄弟)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 前言&#xff1a; 在我们的生活中&#xff0c;无处不在用到排序&#xff0c;比如说成绩的排名&#xff0c;淘宝&#xff0c;京东等等商品在各个方面的排序&#xff0c;这样看来一个好的算 法很重要&#xff0c;接下来我们要先…

JVM对象创建与内存分配机制

对象的创建 对象创建的主要流程: ​ 1.类加载检查 虚拟机遇到一条new指令时&#xff0c;首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用&#xff0c;并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有&#xff0c;那必须先执行相应…

Lua学习笔记:debug.sethook函数

前言 本篇在讲什么 使用Lua的debug.setHook函数 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text工具 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449; ♠ 一级标题 &…

【AI视野·今日NLP 自然语言处理论文速览 第三十八期】Thu, 21 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 21 Sep 2023 Totally 57 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Chain-of-Verification Reduces Hallucination in Large Language Models Authors Shehzaad Dhuliawala, Mojt…

华为杯数学建模比赛经验分享

再过一周左右,第二十届华为杯数学建模比赛就要开赛了&#xff0c;所以今天分享一下个人数学建模比赛的经验。 今天给大家分享一期关于华为杯数学建模比赛的经验分享&#xff0c;我将从以下三个方面展开说明&#xff1a; &#xff08;1&#xff09;如何准备数学建模比赛&#x…

系统集成|第十七章(笔记)

目录 第十七章 变更管理17.1 项目变更的基本概念17.2 变更管理的基本原则17.3 角色职位与工作程序17.4 相关事宜 上篇&#xff1a;第十六章、信息&#xff08;文档&#xff09;和配置管理 下篇&#xff1a;第十八章、安全管理 第十七章 变更管理 17.1 项目变更的基本概念 变更…

获取热门电影算法

功能#2&#xff1a;获取热门电影 为我们的“Netflix”项目实现“获取热门电影”功能。 我们将介绍以下内容 描述 解决方案 复杂性措施 时间复杂度 空间复杂度 描述# 现在&#xff0c;我们需要建立一个标准&#xff0c;以便将来自多个国家的顶级电影组合成一个单一的顶级电影…