题目1507:不用加减乘除做加法

题目描述:

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

输入:

输入可能包含多个测试样例。
对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000)。

输出:

对应每个测试案例,输出m+n的值。

样例输入:
3 4
7 9
样例输出:
7
16
思路:两个数a,b相加,a ^ b表示不算上进位的结果,(a&b)<<1表示进位的结果,直到两个数没有进位产生才截止

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();
	}
}



你可能感兴趣的:(题目1507:不用加减乘除做加法)