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

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

     1 class Solution {
     2 public:
     3     int Add(int num1, int num2)
     4     {
     5         int sum=0,carry=0;
     6         do{
     7             sum=num1^num2;
     8             carry=(num1&num2)<<1;
     9             num1=sum;
    10             num2=carry;
    11         }while(carry!=0);
    12         return sum;
    13     }
    14 };

    转自:http://blog.csdn.net/htyurencaotang/article/details/11125415

    分析:

    (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 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 int Add(int nNum1, int nNum2)
     6 {
     7     int nOne = 0;//保存不进位值   异或运算结果
     8     int nTwo = 0;//保存进位结果   与运算,然后左移一位结果
     9         
    10     do 
    11     {
    12        nOne = nNum1 ^ nNum2;
    13        nTwo = (nNum1 & nNum2) << 1;
    14 
    15        nNum1 = nOne;
    16        nNum2 = nTwo;
    17     } while (nTwo != 0);
    18 
    19     return nOne;
    20 }
    21 
    22 int _tmain(int argc, _TCHAR* argv[])
    23 {
    24     cout << Add(15, 117) << endl;
    25     system("pause");
    26     return 0;
    27 }

    扩展题目:

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

    1 a = a + b;
    2 b = a - b;
    3 a = a - b;

    方法二:基于异或运算

    1 a = a ^ b;
    2 b = a ^ b;
    3 a = a ^ b;
  • 相关阅读:
    POJ 3126 Prime Path
    POJ 2429 GCD & LCM Inverse
    POJ 2395 Out of Hay
    【Codeforces 105D】 Bag of mice
    【POJ 3071】 Football
    【POJ 2096】 Collecting Bugs
    【CQOI 2009】 余数之和
    【Codeforces 258E】 Devu and Flowers
    【SDOI 2010】 古代猪文
    【BZOJ 2982】 combination
  • 原文地址:https://www.cnblogs.com/zl1991/p/4794193.html
Copyright © 2011-2022 走看看