Java不用加减乘除做加法(图文详解)

简介: 1.题目描述2.题解分析具体实现

1.题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。


示例


输入:1 2

输出:3


2.题解

分析

不能使用加减乘除四则运算符,那我们只能考虑使用位运算符


首先,我们分析十进制如何相加:(如159 + 167)


1.先将各个位上的数字相加(不考虑进位),

百位:1 + 1 = 2,十位:5 + 6 = 1,个位:9 + 7 = 6,即216

2.找出进位的数 5 + 6 = 11,存在进位,进位是100,9 + 7 = 16存在进位,进位是10

3.将进位数与不考虑进位的结果216相加,得100 + 10 + 216 = 326


那么,如何使用位运算实现各个位的相加?(例如15 + 9)


将数字转换为二进制形式:15-> 1111   9->1001


1.先将每一位相加,且不考虑进位。二进制满2进位,即1 + 1 = 10,此时不考虑进位,因此,可以通过异或实现不考虑进位的相加,即 1 + 1 = 0,0 + 0 = 0,1 + 0 = 1,此时1111 + 1001 = 0110

2.找出进位的数。当出现1 + 1时,产生进位,我们可以通过两个数按位与找到这些存在进位的数,再将其向左移动1位,实现进位

3.将1和2得到的数字相加,由于相加不能使用加法,即重复1、2步骤,模拟实现加法,当进位为0时,即不再产生进位,此时异或的结果即为两个数相加的结果


即:

23b362a981bb4d7f98f70182d64605ca.png




具体实现

importjava.util.*;
publicclassSolution {
publicintAdd(intnum1,intnum2) {
while(num2!=0){
//各位相加,不考虑进位intsum=num1^num2;
//找到存在进位的数intcarray= (num1&num2) <<1;
//将前两步的值相加,相加不能使用加法,则重复前两步//直到不产生进位、//当进位的值为0时,此时异或的结果即为两数相加的值num1=sum;
num2=carray;
        }
returnnum1;
    }
}


注:题目出自牛客网,链接如下


https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=23249&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

目录
相关文章
|
5月前
|
Java
在Java中,你可以创建一个简单的四则运算程序来执行小学级别的加减乘除操作
【6月更文挑战第19天】Java程序实现简单四则运算,接收用户输入的两个数字和运算符,根据运算符调用相应函数进行计算。包含加、减、乘、除功能,其中除法操作检查了除数是否为零,避免运行时错误。
53 5
|
5月前
|
Java
Java中的左移运算符及其在实现加法效果上的应用
Java中的左移运算符及其在实现加法效果上的应用
|
存储 Java 程序员
Java八种基本数据类型&字符串&运算符(图文详解)
Java基本类型共有八种,基本类型可以分为三类,字符类型char布尔类型boolean数值类型byte、short、int、long、float、double数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。 四种整型的特点 逻辑与的运算规则为:有一个运算数为假,其值为假,两个运算数都为真,其值为真。逻辑与的关系值表如下图所示 逻辑或的运算规则为:有一个运算数为真,其值为真,两个运算数都为假,其值为假。逻辑或的关系值表如下图所示。......
180 0
|
Java
Java旋转数组中的最小数字(图文详解版)
1.题目描述 2.题解 分析 具体实现 方法一(遍历): 方法二(排序): 方法三(二分查找):
68 1
|
6月前
|
数据可视化 小程序 Java
【Java】——实现可视化加减乘除计算器
【Java】——实现可视化加减乘除计算器
【Java】——实现可视化加减乘除计算器
|
人工智能 Java BI
【Java基础】位运算实现加减乘除
&:按位与,对应位都为 1 时结果为 1,否则为 0。 |:按位或,对应位有一个为 1 时结果为 1,否则为 0。 ^:按位异或,对应位不同时结果为 1,否则为 0。 ~:按位取反,将每一位取反。 <<:左移,将所有位向左移动指定的位数,右边补零。
97 0
|
6月前
|
Java 索引
Java环形链表(图文详解)
Java环形链表(图文详解)
92 0
|
存储 算法 Java
Java数据结构与算法分析(十)B树图文详解(含完整代码)
迄今为止,已经介绍了《 二叉查找树 》和《 AVL树 》,我们始终假设可以把整个数据结构存储在内存中。可是,如果数据多到内存装不下,这就意味着必须把数据放在磁盘上,显然这些数据结构不再适用。 问题在于磁盘的I/O速度是远远不如内存访问速度的,然而从一棵树中查找到某个元素,必须从根节点一层层往下找,这每一次查找便是一次I/O操作。为了提高性能,就必须要减少查找的次数。 如能减少树的高度、增加每个节点中的元素数,便是种有效的解决方案。实现这种想法的一种方法是使用B树。
163 1
|
存储 Java
Java中-BigDecimal类型如何进行加减乘除运算?
Java中-BigDecimal类型如何进行加减乘除运算
178 0
|
存储 机器学习/深度学习 人工智能
单调栈图文详解(附Java模板)
单调栈图文详解(附Java模板)
367 1