題目1507:加減乗除しないで加算する
1725 ワード
タイトルの説明:
1つの関数を書いて、2つの整数の和を求めて、関数の体内で+、-、*、/の4つの演算記号を使用してはいけないことを要求します.
入力:
入力には、複数のテストサンプルが含まれる場合があります.各テストケースについて、2つの整数mとn(1<=m、n<=1000000)と入力します.
出力:
各テストケースに対応して、m+nの値を出力します.
サンプル入力:
サンプル出力:
考え方:2つの数a,bを加算し、a^bは進位を計算しない結果を表し、(a&b)<<1は進位の結果を表し、2つの数が進位が発生しないまで締め切る
1つの関数を書いて、2つの整数の和を求めて、関数の体内で+、-、*、/の4つの演算記号を使用してはいけないことを要求します.
入力:
入力には、複数のテストサンプルが含まれる場合があります.各テストケースについて、2つの整数mとn(1<=m、n<=1000000)と入力します.
出力:
各テストケースに対応して、m+nの値を出力します.
サンプル入力:
3 4
7 9
サンプル出力:
7
16
考え方:2つの数a,bを加算し、a^bは進位を計算しない結果を表し、(a&b)<<1は進位の結果を表し、2つの数が進位が発生しないまで締め切る
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.io.OutputStreamWriter;
import java.util.Scanner;
class Main implements Runnable
{
private static final boolean DEBUG = false;
private Scanner cin;
private PrintWriter cout;
private int a, b;
private void init()
{
try {
if (DEBUG) {
cin = new Scanner(new BufferedInputStream(new FileInputStream("d:\\OJ\\uva_in.txt")));
} else {
cin = new Scanner(new BufferedInputStream(System.in));
}
cout = new PrintWriter(new OutputStreamWriter(System.out));
} catch (Exception e) {
e.printStackTrace();
}
}
private boolean input()
{
if (cin.hasNextInt()) {
a = cin.nextInt();
} else return false;
if (cin.hasNextInt()) {
b = cin.nextInt();
} else return false;
return true;
}
private int add(int num1, int num2)
{
int tmp1, tmp2;
do {
tmp1 = num1 ^ num2;
tmp2 = (num1 & num2) << 1;
num1 = tmp1;
num2 = tmp2;
} while (num2 != 0);
return num1;
}
private void solve()
{
int ans = add(a, b);
cout.println(ans);
cout.flush();
}
public void run()
{
init();
while (input()) {
solve();
}
}
public static void main(String[] args)
{
new Thread(new Main()).start();
}
}