【剣指Offer面接プログラミング問題】タイトル1507:加減乗除しない加算をする--9度OJ


タイトルの説明:
1つの関数を書いて、2つの整数の和を求めて、関数の体内で+、-、*、/の4つの演算記号を使用してはいけないことを要求します.
入力:
入力には、複数のテストサンプルが含まれる場合があります.各テストケースについて、2つの整数mとn(1<=m、n<=1000000)と入力します.
出力:
各テストケースに対応して、m+nの値を出力します.
サンプル入力:
3 4
7 9

サンプル出力:
7
16

【解題構想】四則演算ではなく和を求めるには、加算の機械的実現を連想する必要があるかもしれません.機械的実現はもちろん原理とビット操作が似ているので、ビット操作によって加算を実現することができます.
与えられたnum 1とnum 2を仮定すると,まずnum 1^num 2を0 1ビット加算すべきであり,キャリーなしで得た.次にnum 1&&num 2を用いてすべてのキャリー組成の数を得た.このキャリー組成の数は1ビット左にシフトし、以前に得られたキャリーなしの数に加わるべきであるからである.もし、キャリーがあり、証明ビット操作が衝突している場合は、左に移動し続け、前の結果に追加する必要があります.すべてのキャリー処理が完了するまで.
AC code:
#include 
using namespace std;
 
int main()
{
  int n,m;
  while (scanf("%d%d",&n,&m)!=EOF)
  {
    int num1,num2;
    do
    {
      num1=n^m;
      num2=(n&m)<<1;
      n=num1;
      m=num2;
    }while(num2!=0);
    printf("%d
",num1); } return 0; } /************************************************************** Problem: 1507 User: huo_yao Language: C++ Result: Accepted Time:10 ms Memory:1020 kb ****************************************************************/
http://ac.jobdu.com/problem.php?pid=1507

九度-剣指Offer練習問題全套解答ダウンロード:http://download.csdn.net/detail/huoyaotl123/8276299