《剑指offer》不用加减乘除做加法

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:[email protected]】

题目链接:http://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题目描述

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

思路

题目要求不用四则运算,那么我们能够想到的也就只有位运算了,那么我们怎么使用位运算来计算加法呢?

首先我们看,两数相加不进位的情况,这其实就是两个数异或的值。

而我们接下来就得计算进位了,我们知道二进制中只有同为1的时候才需要进位,而同为1的话,我们只有通过&运算来取得。

得到了上述的结论之后,我们就可以知道,整个加法的过程就是两个数的异或和相与并左移的一个过程了。

class Solution
{
	public:
		int Add(int num1, int num2)
		{
			int sum,carry;
			do
			{
				sum = num1^num2;
				carry = (num1&num2)<<1;

				num1 = sum;
				num2 = carry;
			}while(num2);
			return num1;
		}
};

版权声明:本文为博主原创文章,如果转载,请注明出处

时间: 2024-10-12 17:36:06

《剑指offer》不用加减乘除做加法的相关文章

剑指Offer——不用加减乘除做加法

题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 分析: "^"是不带进位的加法. "&"可以得到所有进位位组成的数. 我们只需要将不进位加后的数与所有进位位组成的数右移一位的结果相加就可以得到和. 不过我们在上面一步的加法过程中,我们也只能用"^"不进位的加法. 所以我们要循环之前的步骤直到不出现进位的情况,这样我们的"^"就和普通加法一样了. 代码: 1 class Sol

剑指:不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷ 四则运算符号. 样例 输入:num1 = 1 , num2 = 2 输出:3 解法 先对两数进行异或,求得相加不进位的结果.再循环对两数进行按位与运算,并左移一位,直至进位为 0. public class Solution { public int Add(int num1,int num2) { while(num2!=0){ int t = num1 ^ num2; //不进位相加 num2 = (num1&num

剑指Offer47 不用加减乘除做加法

1 /************************************************************************* 2 > File Name: 47_AddTwoNumbers.c 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年09月04日 星期日 21时33分07秒 6 *************************************

剑指offer---不用加减乘除做加法

class Solution { public: int Add(int num1, int num2) { while (num2--) { num1++; } return num1; } };

48、剑指offer--不用加减乘除做加法

题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 解题思路:例如5+17转化成二进制即为101+10001 1)不考虑进位101 + 10001 = 10100 2)进位1+1 = 10 3)相加10100+10 = 10110 =22 所以分别算不考虑进位和进位的相加即可,其中不考虑进位相当于异或操作0^0 = 0 0^1 = 1 1^0 = 1 1^1 =0,进位操作相当于先求&再左移1 1&1 = 1 1<<1 = 10 1 cla

【剑指offer】不用加减乘除做加法

转载请注明出处: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.加上进位

剑指offer (47) 不用加减乘除做加法

题目:求两个整数之和,要求不得使用 加减乘除四则运算 题解分析:加减乘除都不能用,还要进行各种运算,必然想到 位运算 十进制加法: 5 + 17 = 22 step1. 各位相加,不考虑进位,即舍弃进位,结果为 12 (5 + 7 = 12舍弃进位) step2. 做进位 (5 + 7 = 12 > 9 有进位) 进位为10 step3. 两步结果相加 12 + 10 = 22 二进制加法:5 + 17 = 22 即 101 + 10001 step1. 各位相加,不考虑进位,即舍弃进位,结果为

剑指Offer对答如流系列 - 不用加减乘除做加法

面试题65:不用加减乘除做加法 题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.×.÷四则运算符号. 问题分析 我们之前详细探讨了位运算 剑指Offer对答如流系列 - 二进制中 1 的个数,已经非常非常详细了. 这道题仅仅是让做加法,我们除此之外还是做了乘除与减法. 记不清的朋友可以回头看看. 这里象征性地做一次解答吧 问题解答 public int add(int num1,int num2) { while(num2!=0){ int sum=num1^num2; in

剑指Offer面试题47(Java版):不用加减乘除做加法

题目:写一个函数,求两个整数之和,要求在函数体内不得适用+,-,* ,./  四则运算符号 面试的时候被问道这个问题,首先我们分析人们是如何进行十进制的加法的,比如是如何得出5+17=22的结果的,实际上,我们可以分三步进行:第一步只做各位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为10:第三步,把前面的两个结果加起来12+10的结果是22,刚好5+17=22 我们一直在想,求两个树之和四则运算都不能用,还能用什么?对数字做运算,除了四则运算之外,也就只剩下位运算了

剑指offer系列源码-不用加减乘除做加法

题目1507:不用加减乘除做加法 时间限制:1 秒内存限制:128 兆特殊判题:否提交:782解决:581 题目描述: 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. 输入: 输入可能包含多个测试样例. 对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000). 输出: 对应每个测试案例,输出m+n的值. 样例输入: 3 4 7 9 样例输出: 7 16 解法:模拟二进制加 #include <iostream> #include&l