题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目地址 https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&tqId=11201&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 首先看十进制是如何做的: 5+7=12, 可以使用三步…
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. [思路] 首先看十进制是如何做的: 5+7=12,三步走第一步:相加各位的值,不算进位,得到2.第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果.第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或…
剑指offer 65. 不用加减乘除做加法(Leetcode 371. Sum of Two Integers) https://leetcode.com/problems/sum-of-two-integers/ 题目: 写一个函数,求两个整数之和,要求在函数体内不得使用加减乘除这四个符号. 分析: 对于不能使用正常的四则运算符,一般就是使用位运算了.而本题要想实现加法,只能使用异或了. 需要注意的是,加法的时候涉及进位,而进位的实现利用与运算. 此外,进位之后还有可能产生进位,所以要在循环里…
剑指 Offer 65. 不用加减乘除做加法 Offer_65 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/14 21:49 */ /** * 题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"."/" 四则运算符号. */ public class Offer…
[剑指Offer]不用加减乘除做加法 解题报告(Java) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题方法 这就是LeetCode的Sum of Two Integers题目,Python版本的比较复杂,所以这里用的Java写的.道理是一样的,通过异或模拟无进位的加法,通过与运算模拟进位. 代码: publ…
  本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 思路 对数字做运算,除了四则运算外,只剩下位运算了.根据一般情况下的加法步骤,设计如下: 1)不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或^操作: 2)计算进位:只有1加1产生进位,所以采用位与&操作,再左移1位: 3)将和与进位相加,即重复前…
该题目来源于牛客网<剑指offer>专题. 第一步:相加各位的值,不算进位,得到010,二进制每位相加就相当于各位做异或操作,101^111. 第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1. 第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1. 继续重复上述两步:1000^100 = 1100,进位值为0,跳出循环,1100为最终结果…
原创博文,转载请注明出处! # 题目 # 思路 第一步:不考虑进位对每一位相加(异或操作) 第二步:考虑进位(位与运算+左移) 第三步:第一步和第二步相加(重复执行前两步) # 代码 #include <iostream> using namespace std; class Solution { public: int Add(int num1, int num2) { int res,carry; do{ // 第一步:不考虑进位做加法(异或操作) res = num1^num2; //…
转载请注明出处:http://blog.csdn.net/ns_code/article/details/27966641 题目描写叙述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包括多个測试例子.对于每一个測试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 相应每一个測试案例,输出m+n的值. 例子输入: 3 4 7 9 例子输出: 7 16 思路: 1.先将各bit位相加,不计进位,这一步能够用m^n实现 2.…
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号.   题解: 使用位运算   class Solution { public: int Add(int num1, int num2){ int sum, carry; ) { sum = num1 ^ num2;//只现相加,不进位 carry = (num1&num2) << ;//记录进位 num1 = sum; num2 = carry; } return num1; } };…
分析: (1)十进制加法分三步:(以5+17=22为例) 1. 只做各位相加不进位,此时相加结果为12(个位数5和7相加不进位是2,十位数0和1相加结果是1): 2. 做进位,5+7中有进位,进位的值是10: 3. 将前面两个结果相加,12+10=22 (2)这三步同样适用于二进制位运算 1.不考虑进位对每一位相加.0加0.1加1结果都是0,0加1.1加0结果都是1.这和异或运算一样: 2.考虑进位,0加0.0加1.1加0都不产生进位,只有1加1向前产生一个进位.可看成是先做位与运算,然后向左移…
参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html <原码,反码,补码 详解> 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题思路 不能使用加减乘除,我的第一反应就是使用 位运算 和 二进制字符串判断 .二进制字符串从末尾到首位一位位判断,也是能得出结果的,但是代码太长,判断多种情况,太麻烦了.这并不是一个聪明的方法,舍弃了. 另一种方法是位运算.一…
1 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 2 思路和方法 位运算符:两个数异或(^)[1^0=1, 1^1=0, 0^0=0, 0^1=1, 5^5=0, 5^0=5],相当于每一位相加,而不考虑进位:两个数相与(&)[1&0=0:1&1=1:0&0=0],并左移一位,相当于求得进位:将上述两步的结果相加. 我们可以用三步走的方式计算二进制值相加: 5-101,7-111 第一步:异或(^)相加各位的值,不算进位,101^…
题目 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题解 用位运算模拟加法的三步: 无进位加法:异或运算. 进位:与运算再左移一位. 直到进位为0结束. 代码 public class Main { public static void main(String[] args) { System.out.println(Add(5,17)); } public static int Add(int num1,int num2) { int sum=0; int c…
剑指 Offer 65. 不用加减乘除做加法 知识点:数学:位运算 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用 "+"."-"."*"."/" 四则运算符号. 示例 输入: a = 1, b = 1 输出: 2 解法一:位运算 不能用四则运算,那其实可以用的只要逻辑运算和位运算了,这里很明显要用位运算.关键怎么用呢. 我们列一张表其实就可以发现,两个元素如果没有进位也就是不是对应位都是1的时候,相加就和异或运…
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 题目分析 不用加减乘除做加法,我第一时间想到的就是用位运算,毕竟计算机是二进制的,所有的操作都是以位运算为基础. 那么假设我们要求7+5=12,二进制就是111+101=1100,我们发现也就是需要处理二进制进位的问题,可是如何处理二进制进位呢? 如果学过计算机体系结构中的进位器就知道怎么做了,不过没学过也没关系,我们可以一步一步的实验,反正位运算就那几种. 先实验下异或:res1=111^101=010,…
剑指Offer - 九度1507 - 不用加减乘除做加法2013-11-29 20:00 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 对应每个测试案例,输出m+n的值. 样例输入: 3 4 7 9 样例输出: 7 16 题意分析: 求两个数的和而不能用加减乘除,很明显又得借助位运算了.回想一下学Verilog时加法器的实现,能记住…
// 面试题65:不用加减乘除做加法 // 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷ // 四则运算符号. #include <iostream> int Add(int num1, int num2) { int sum, carry; do { sum = num1 ^ num2;//第一步,使用异或求和(没有进位) carry = (num1 & num2) << ;//第二步,使用与检查同时为1的位,作为进位,左移一位 num1 = s…
面试题 65. 不用加减乘除做加法 题目描述 题目:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. Java 实现 public class Solution {     public int Add(int num1,int num2) {         while (num2!=0) {             int temp = num1^num2;             num2 = (num1&num2)<<1;             …
在看<剑指Offer>过程中,面试题47不用加减乘除做加法,给出的思路是使用二进制的异或以及与运算,总之就是使用二进制.但是在使用Python实现的过程中,对于正整数是没有问题的,但是对于负数,会出现死循环情况.这是为什么呢?因为在Python中,对于超出32位的大整数,会自动进行大整数的转变,这就导致了在右移位过程中,不会出现移到了0的情况,也就会造成了死循环. 这里需要了解的是Python中整数实现的原理以及二进制中的移位等原理. 已经知道了右移过程中大整数的自动转化,导致变不成0,那么只…
不用加减乘除做加法 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 写一个函数, 求两个整数之和, 要求在函数体内不得使用+, -, *, /四则运算符号. 不能使用运算符号, 使用位运算, 第一步异或运算选位, 第二步与运算进位. 代码: /* * main.cpp * * Created on: 2014.7.13 * Author: Spike */ #include <iostream> #include <list>…
剑指 Offer 48. 最长不含重复字符的子字符串 Offer_48 题目详情 解法分析 解法一:动态规划+哈希表 package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2021/2/8 20:52 */ import java.util.HashMap; /** * 题目描述:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度. */ public class Offer_48 { publ…
题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 对应每个测试案例,输出m+n的值. 样例输入: 3 4 7 9 样例输出: 7 16 [解题思路]求和而不用四则运算,我们可能需要联想到加法的机器实现,机器实现当然原理和位操作类似,所以,我们可以通过位操作来实现加法. 假设给出的num1和num2,首先我们将num1^num2得到那些…
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 牛客网刷题地址 思路分析 对数字做运算,除了四则运算外,只剩下位运算了.根据一般情况下的加法步骤,设计如下: 不考虑进位对每一位相加:1加0,0加1都等于1,而0加0,1加1等于0,所以使用异或操作: 计算进位:只有1加1产生进位,所以采用位与&操作,再左移1位: 将和与进位相加,即重复前两步操作.结束判断为进位为0. 测试用例 输入正数.负数和0. J…
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度.假设字符串中只包含从'a'到'z'的字符. 思路 动态规划法:定义函数f(i)为:以第i个字符为结尾的不含重复字符的子字符串的最大长度. (1)当第i个字符之前未出现过,则有:f(i)=f(i-1)+1 (2)当第i个字符之前出现过,记该字符与上次出现的位置距离为d 1)如果d<=f(i-1…
总结 1. Leetcode 上有一道题, 是不用乘除做乘法, 那道题算是背包问题的变形 2. 不用加减乘除, 还可以用移位操作 3. 将数字转成二进制格式, 然后运用二进制亦或, 移位运算解决 3.1 仅考虑各位相加, 不考虑进位, num1 ^ num2 3.2 仅考虑进位, (num1 & num2) << 1; 3.3 将上面两步的和加起来 code #include <iostream> using namespace std; int Add(int num1,…
//不用加减乘除四则运算,来做加法 //题目:两个数做加法. //思路:用二进制的位运算的思路.第一步:首先两数相加考虑进位.可以用异或. //第二步:两个数相加只考虑进位,并将最后的结果左移.第三步:将第一二步的结果相加. public class AddN { public int add(int a,int b){ //递归实现 int sum1=a^b; ; ){ return add(sum1,sum2); } /*循环实现 * int sum1,sum2; do{ sum1=a^b;…
  题目描述:   写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号.   解题思路:   本题同样是对发散思维能力的一个考察.首先,我们需要考虑是要求和却不能使用四则运算,那么还能用什么呢?除了四则运算以外,还可以进行计算的也就只剩下了位运算.因此,需要进一步考虑二进制数的位运算,用位运算来代替加法.   具体思路是:三步走策略.第一步,不考虑进位对每一位相加(模2和),也就是0+0=0,1+1=0,0+1=1,1+0=0,不难看出这一步其实就是做异或运算.第二步,…
题目: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 思路: 很容易想到通过位运算来解决问题. 以5+17=22为例,参考十进制加法:1.只做各位相加不进位运算,即得到12,:2.做进位运算,即得到10,:3.把前面两个结果先相加,即得到22: 同样二进制加法也一样: 1.两个整数做异或^运算,得到各位相加不进位的运算结果: 2.两个整数做与&运算,然后再左移一位,即得到进位的运算结果: 3.将上面两个结果相加,即重复步骤1,2,直至进位的运算结果为0: 类似题…
题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 一 . 理解题目 这个题目可以让我们回归到小学,想想加法的竖式是怎么写的,哈哈,如果当时你不是那个竖式写错了,是不是就不在3班了?是不是就不会在这里写什么这这这..... 海绵宝宝,这就是人生啊.. 回归题目:加法的竖式无非三步走,一.个位数相加:二.个位数进位(或者不进位):三.十位数相加.后面的都是一样了,不一一赘述. 但是,此题目不可用加减乘除,所以要借用二进制数的位运算符.当然目的也是和上面一样,相…