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

目录
相关文章
|
6月前
|
存储 Java 程序员
Java八种基本数据类型&字符串&运算符(图文详解)
Java基本类型共有八种,基本类型可以分为三类,字符类型char布尔类型boolean数值类型byte、short、int、long、float、double数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。 四种整型的特点 逻辑与的运算规则为:有一个运算数为假,其值为假,两个运算数都为真,其值为真。逻辑与的关系值表如下图所示 逻辑或的运算规则为:有一个运算数为真,其值为真,两个运算数都为假,其值为假。逻辑或的关系值表如下图所示。......
112 0
|
2月前
|
数据可视化 小程序 Java
【Java】——实现可视化加减乘除计算器
【Java】——实现可视化加减乘除计算器
43 0
【Java】——实现可视化加减乘除计算器
|
3月前
|
Java 索引
Java环形链表(图文详解)
Java环形链表(图文详解)
34 0
|
8月前
|
Java
Java旋转数组中的最小数字(图文详解版)
1.题目描述 2.题解 分析 具体实现 方法一(遍历): 方法二(排序): 方法三(二分查找):
44 1
|
9月前
|
人工智能 Java BI
【Java基础】位运算实现加减乘除
&:按位与,对应位都为 1 时结果为 1,否则为 0。 |:按位或,对应位有一个为 1 时结果为 1,否则为 0。 ^:按位异或,对应位不同时结果为 1,否则为 0。 ~:按位取反,将每一位取反。 <<:左移,将所有位向左移动指定的位数,右边补零。
69 0
|
9月前
|
存储 Java
Java中-BigDecimal类型如何进行加减乘除运算?
Java中-BigDecimal类型如何进行加减乘除运算
68 0
|
10月前
|
Java
汉诺塔问题(Hanoi Tower)--递归典型问题--Java版(图文详解)
汉诺塔问题(Hanoi Tower)--递归典型问题--Java版(图文详解)
|
10月前
|
Java
java数据结构22:多项式加法
我们经常遇到两多项式相加的情况,在这里,我们就需要用程序来模拟实现把两个多项式相加到一起。首先,我们会有两个多项式,每个多项式是独立的一行,每个多项式由系数、幂数这样的多个整数对来表示。
155 0
|
10月前
|
Java 索引
力扣35搜索插入位置:思路分析+图文详解+代码实现+拓展java源码
力扣35搜索插入位置:思路分析+图文详解+代码实现+拓展java源码
84 0
|
11月前
|
存储 算法 Java
Java数据结构与算法分析(十)B树图文详解(含完整代码)
迄今为止,已经介绍了《 二叉查找树 》和《 AVL树 》,我们始终假设可以把整个数据结构存储在内存中。可是,如果数据多到内存装不下,这就意味着必须把数据放在磁盘上,显然这些数据结构不再适用。 问题在于磁盘的I/O速度是远远不如内存访问速度的,然而从一棵树中查找到某个元素,必须从根节点一层层往下找,这每一次查找便是一次I/O操作。为了提高性能,就必须要减少查找的次数。 如能减少树的高度、增加每个节点中的元素数,便是种有效的解决方案。实现这种想法的一种方法是使用B树。
81 0