发散思维题——不用加减乘除做加法(剑指offer)

来源:互联网 发布:软件开发速成班 编辑:程序博客网 时间:2024/06/03 12:07

不用加减乘除做加法
  • 参与人数:1096时间限制:1秒空间限制:32768K
  • 通过比例:37.37%
  • 最佳记录:0 ms|0K()

题目描述

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

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


思路:我首先想到的是二进制位运算,是的。还记得之前swap的实现吗?

a=a^b;

b=a^b;

a=a^b;

就可以不借助第三个变量把a,b交换!

其实这和

a=a+b;

b=a-b;

a=a-b;

有一定的联系呢。哈哈!

如果我把c=a^b;

d=(a&b)<<1;//这是进位;那么c^d就是得到的和,前提是c&d==0即没有再进位了。那么来个循环吧。


自己在草稿纸上模拟下进位的过程,就ok了!

#include<stdio.h>class Solution {public:    int Add(int num1, int num2)    {        int tmp1=num1^num2;        int tmp2=num1&num2;        tmp2<<=1;        while(tmp2)        {            int tmp3=tmp1^tmp2;            tmp2=tmp1&tmp2;            tmp2<<=1;            tmp1=tmp3;        }        return tmp1;    }};int main(){    Solution so;    int n,m;    while(scanf("%d%d",&n,&m)!=EOF)    {        printf("%d\n",so.Add(n,m));    }    return 0;}

0 0
原创粉丝点击