【剣指Offer面接プログラミング問題】タイトル1507:加減乗除しない加算をする--9度OJ
1611 ワード
タイトルの説明:
1つの関数を書いて、2つの整数の和を求めて、関数の体内で+、-、*、/の4つの演算記号を使用してはいけないことを要求します.
入力:
入力には、複数のテストサンプルが含まれる場合があります.各テストケースについて、2つの整数mとn(1<=m、n<=1000000)と入力します.
出力:
各テストケースに対応して、m+nの値を出力します.
サンプル入力:
サンプル出力:
【解題構想】四則演算ではなく和を求めるには、加算の機械的実現を連想する必要があるかもしれません.機械的実現はもちろん原理とビット操作が似ているので、ビット操作によって加算を実現することができます.
与えられたnum 1とnum 2を仮定すると,まずnum 1^num 2を0 1ビット加算すべきであり,キャリーなしで得た.次にnum 1&&num 2を用いてすべてのキャリー組成の数を得た.このキャリー組成の数は1ビット左にシフトし、以前に得られたキャリーなしの数に加わるべきであるからである.もし、キャリーがあり、証明ビット操作が衝突している場合は、左に移動し続け、前の結果に追加する必要があります.すべてのキャリー処理が完了するまで.
AC code:
九度-剣指Offer練習問題全套解答ダウンロード:http://download.csdn.net/detail/huoyaotl123/8276299
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