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

news2024/12/26 11:11:01

给你两个整数 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)); // 输出3
    printf("%d\n", getSum(2, 3)); // 输出5
    return 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; // 输出3
    std::cout << solution.getSum(2, 3) << std::endl; // 输出5
    return 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)); // 输出3
        System.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.coloradmin.cn/o/1044264.html

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

相关文章

树莓派上使用kettle将文本文档导入mariadb

目录 1 连接MariaDB的前置条件 2 test.txt 3 在mariadb中创建数据库和数据表 4 在kettle中的操作 4.1 新建任务 4.2 连接数据库 4.3 文本文件输入 4.4 表输出 4.5 运行 4.6 结果 1 连接MariaDB的前置条件 首先你的mariaDB要有密码&#xff0c;我当前的用…

H3CNE

H3CNE 计算机网络概述 计算机网络定义 一组自治计算机互联的集合 计算机网络基本功能 资源共享 综合信息服务 分布式处理与负载均衡 计算机网络的类型 局域网 LAN 由用户自行建设&#xff0c;使用私有地址组建的内部网络 城域网 MAN 由运营商或大规模企业建设&am…

快速排序与冒泡排序以及代码

快速排序 快速排序&#xff08;Quicksort&#xff09;是一种常用的排序算法&#xff0c;它基于分治的思想。 时间复杂度&#xff1a;O&#xff08;nlogn&#xff09; 空间复杂度&#xff1a;O&#xff08;logn&#xff09; 快速排序的基本思想如下&#xff1a; 选择一个元素…

ffmpeg+flv视频推拉流实现(demo版)

前言 工作需要&#xff0c;记录一下前后端推拉流方案&#xff0c;基于HTTP-FLV协议&#xff0c;使用node flv.js ffmpeg进行前后端交互。 此方案为demo版&#xff0c;目的是打通前后端链路&#xff0c;项目应用正在研究中。 步骤 1.安装ffmpeg 后端推流需要借助ffmpeg流媒…

centos7 添加网卡设置动态ip,修改网卡为任意名称

centos7 添加网卡并设置动态ip&#xff0c;重命名为任意名称 本文记录如何在centos环境上增加两个网卡&#xff0c;并设置为动态获取ip&#xff0c;以及修改网卡名称为任意名称 1、centos7添加两个网卡动态获取ip 1.1 vmvare上添加网络适配器 1、关闭虚拟机 2、 添加网络适…

Linux:修改mvn命令使用的maven路径

要在 Linux 上更改 Maven 的版本&#xff0c;需要调整 PATH 环境变量以指向所需版本的 Maven 安装目录。 打开终端或命令行界面。 使用文本编辑器打开 /etc/profile 文件&#xff1a; vi /etc/profile在文件的末尾添加以下行&#xff0c;将 PATH 环境变量指向新的 Maven 安装目…

torch.sum()——dim参数

dim指在dim的这个维度上&#xff0c;对tesnor 进行求和&#xff0c;如果keepdim&#xff08;保持维度&#xff09;False&#xff0c;返回结果会删去dim所指的这个维度。以下面的例子分析dim的参数~ torch.tensor([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]) print(…

【高级数据结构C++】树的重心——教父POJ 3107(链式前向星的使用)

》》》算法竞赛 /*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 一个某双流一大学通信与信息专业大二在读 * * brief 一直在竞赛算法学习的路上* * copyright 2023.9* COPYRIGHT 原创技术笔记&#xff1a;转载…

【新版】系统架构设计师 - 案例分析 - 架构设计<Web架构>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 案例分析 - 架构设计&#xff1c;Web架构&#xff1e;Web架构知识点单台机器 到 数据库与Web服务器分离应用服务器集群负载均衡负载均衡技术静态与动态算法Session共享机制有状态与无状态 持久化技…

D2538A 是一块带有 ALC 的单通道前置放大器。它适用于立体声收 录机和盒式录音机。采用 SOP8 及 SOT23-6 的封装形式封装。

D2538A 是一块带有 ALC 的单通道前置放大器。它适用于立体声收 录机和盒式录音机。采用 SOP8 及 SOT23-6 的封装形式封装。 主要特点&#xff1a; ● 带内置 ALC 回路的单通道均衡放大器。 ● 低噪声&#xff1a; VNI1.0V&#xff08;典型值&#xff09;。 ● 开环电压增…

数据库信息速递: Oracle 23C 引入了向量搜索功能,为生成式人工智能应用提供支持 (译)...

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友…

优化 Node.js 性能:检测内存泄漏和高 CPU 使用率

优化 Node.js 性能&#xff1a;检测内存泄漏和高 CPU 使用率 Node.js 是一种流行的 JavaScript 运行时&#xff0c;以其速度、性能和可扩展性而闻名。然而&#xff0c;即使是优化和编写得非常好的 Node.js 应用程序也可能会遇到性能问题&#xff0c;例如内存泄漏和 CPU 使用率…

4K视频一分钟大小是多少?如何转换为其他分辨率?

4K 分辨率是指大约 4,000像素的水平显示分辨率&#xff0c; 4K显示器、电视的分辨率为3840*2160&#xff1b;影院的4K分辨率为40962160。4K视频相较于常见的1080P分辨率更清晰、画面更流畅&#xff0c;然而与之对应的则是文件更大&#xff0c;更占用本地存储内存&#xff0c;在…

距离矢量路由协议RIP(含Cisco模拟器实验命令配置)

距离矢量路由协议RIP(含Cisco模拟器实验命令配置) 简介 距离矢量路由协议&#xff08;Routing Information Protocol, RIP&#xff09;是一种内部网关协议&#xff0c;它位于应用层&#xff0c;使用520 UDP端口。RIP基于距离矢量算法&#xff08;Bellham-Ford&#xff09;根据…

数据探索的新前沿:可视化大屏交互功能

在当今数字化时代&#xff0c;数据和信息是企业成功的关键。可视化大屏已经成为各个行业中数据呈现和决策支持的重要工具。然而&#xff0c;随着技术的发展&#xff0c;用户对于数据可视化的期望也在不断演变。仅仅呈现数据已经不再足够&#xff0c;用户希望能够更深入地与数据…

buildroot中将编译好的库(Qt,tslib)放入嵌入式linux文件系统

首先交叉编译想使用版本的Qt源码&#xff0c;还有tslib库&#xff0c;编译好之后 再次编译buildroot&#xff0c;再编译好的buildroot中会出现output文件夹&#xff0c;然后output文件夹下有target文件夹&#xff0c;这个target文件夹就是将要打包的文件系统&#xff0c;目标目…

Cloudflare分析第二天:解密返回数据

前言 Cloudflare分析第一天&#xff1a;简单的算法反混淆 由上篇for (j "10|8|5|9|1|4|0|2|3|6|7"["split"](|) 可以看到循环的循序 case 6:o (n {},n["msg"] f,n.cc g,hF["VNwzz"](JSON["stringify"](n))["re…

多线程和并发编程(6)—并发编程的设计模式

优雅终止 如何优雅终止线程&#xff1f; 中断线程的思路是使用两阶段法&#xff1a;第一阶段发生中断请求&#xff0c;第二阶段根据中断标识结束线程&#xff1b; public class Test1 {private volatile static boolean interrupted false;public static void main(String[…

生信教程:使用全基因组SNP数据进行ABBA-BABA分析

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 ABBA BABA 统计&#xff08;也称为“D 统计”&#xff09;为偏离严格的分叉进化历史提供了简单而有力的测试。因此&#xff0c;它们经常用于使用基因组规模的 SNP 数据&#xff08;例如来自全基因组测序或 RADseq&#xf…

monkeyrunner环境搭建和初步用法

一、打开模拟器 运行monkeyrunner之前必须先运行相应的模拟器&#xff0c;不然monkeyrunner无法连接设备。 用Elipse打开Android模拟器或在CMD中用Android命令打开模拟器。这里重点讲一下在CMD中用Android命令打开模拟器 命令&#xff1a;emulator -avd test &#xff08;注…