zoukankan      html  css  js  c++  java
  • (剑指Offer)面试题47:不用加减乘除做加法

    题目:

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

    思路:

    很容易想到通过位运算来解决问题。

    以5+17=22为例,参考十进制加法:1、只做各位相加不进位运算,即得到12,;2、做进位运算,即得到10,;3、把前面两个结果先相加,即得到22;

    同样二进制加法也一样:

    1、两个整数做异或^运算,得到各位相加不进位的运算结果;

    2、两个整数做与&运算,然后再左移一位,即得到进位的运算结果;

    3、将上面两个结果相加,即重复步骤1,2,直至进位的运算结果为0;

    类似题目:

    用链表表示十进制数,从链首到链尾,每个结点依次存放十进制从高位到低位上的数字,求两个链表的和,和还是用链表表示;

    代码:

    // non-recursive
    int BitAdd(int num1,int num2){
        int sum=0,carry=0;
        while(num2!=0){
            sum=num1^num2;
            carry=(num1&num2)<<1;
            num1=sum;
            num2=carry;
        }
        return num1;
    }
    
    
    // recursive
    int BitAdd_1(int &num1,int &num2){
        if(num2==0)
            return num1;
        if(num1==0)
            return num2;
        int sum=num1^num2;
        int carry=(num1&num2)<<1;
        return BitAdd(sum,carry);
    }
    
    
    int main()
    {
        int num1=99;
        int num2=99;
        cout << BitAdd(num1,num2) <<endl;
        cout << BitAdd_1(num1,num2) << endl;
        return 0;
    }
    

    在线测试OJ:

    http://www.nowcoder.com/books/coding-interviews/59ac416b4b944300b617d4f7f111b215?rp=2

    AC代码:

    class Solution {
    public:
        int Add(int num1, int num2)
        {
    		int sum=0,carry=0;
            
            while(num2!=0){
                sum=num1^num2;
                carry=(num1&num2)<<1;
                
                num1=sum;
                num2=carry;
            }
            
            return num1;
        }
    };
  • 相关阅读:
    串口操作
    图片转化成二进制数据、等比缩放
    DSO Framer Control Object 操作word文件
    C#图片存入数据库及其读出显示
    对话框的用法
    C#读取数据库中的表
    将Resource中的图片资源动态绑定到PictureBox中:
    ProgressBar
    C# 操作数据库表和数据库
    操作系统–进程管理
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4690680.html
Copyright © 2011-2022 走看看