題目1507:加減乗除しないで加算する

1725 ワード

タイトルの説明:
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();
	}
}