zoukankan      html  css  js  c++  java
  • 剑指offer42:不用加减乘除做加法

    分析:

    (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向前产生一个进位。可看成是先做位与运算,然后向左移动一位

    3.相加过程重复前两步,直到不产生进位为止

    代码如下:

     
      1. // 不用加减乘除做加法  
      2.     public int Add(int num1, int num2) {  
      3.         int sum = num1 ^ num2;  
      4.         int jinwei = (num1 & num2) << 1;  
      5.         return jinwei == 0 ? sum : Add(sum, jinwei);  
      6.     }  

    扩展题目:

    不使用新的变量,交换两个变量的值
    方法一:基于加减法

    [cpp] view plain copy
     
    1. a = a + b;  
    2. b = a - b;  
    3. a = a - b;  

    方法二:基于异或运算

    [cpp] view plain copy
     
      1. a = a ^ b;  
      2. b = a ^ b;  
      3. a = a ^ b;  
  • 相关阅读:
    HDU4565
    CF861D
    UVA 11651
    HDU5950
    POJ3267
    POJ1094
    POJ1905
    HDU3567
    进程的同步与互斥
    预防死锁,检测死锁,避免死锁,解除死锁....
  • 原文地址:https://www.cnblogs.com/wwjldm/p/7294909.html
Copyright © 2011-2022 走看看