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;  
  • 相关阅读:
    灭霸-个人冲刺第四天
    单词统计
    第十周总结
    灭霸-个人冲刺第三天
    07-代码大全阅读笔记之一
    灭霸-个人冲刺第二天
    灭霸-个人冲刺第一天
    06-梦断代码阅读笔记之三
    团队项目-用户场景分析
    第九周总结
  • 原文地址:https://www.cnblogs.com/wwjldm/p/7294909.html
Copyright © 2011-2022 走看看