算法-超大整数相减

 

package actionWords.StorageDeviceMgmt.test;

import java.util.Scanner;

public class BigInterSubtract {
	// Function for finding sum of larger numbers
	static String findSub(String str1, String str2) {
		// Before proceeding further, make sure length
		// of str2 is larger.

		boolean flag = false;
		if (str1.length() < str2.length()) {
			String t = str1;
			str1 = str2;
			str2 = t;
			flag = true;
		} else if (str1.length() == str2.length()) {
			for (int i = 0; i < str1.length(); i++) {
				if (str1.charAt(i) < str2.charAt(i)) {
					String t = str1;
					str1 = str2;
					str2 = t;
					flag = true;
					break;
				}else if (str1.charAt(i) > str2.charAt(i)) {
					break;
				}else {
					continue;
				}

			}
		}

		// Take an empty String for storing result
		String str = "";

		// Calculate length of both String
		int n1 = str1.length();
		int n2 = str2.length();

		// Reverse both of Strings
		str1 = new StringBuilder(str1).reverse().toString();
		str2 = new StringBuilder(str2).reverse().toString();

		int carry = 0;
		for (int i = 0; i < n2; i++) {
			// Do school mathematics, compute sum of
			// current digits and carry
			int strInt_1 = (int) (str1.charAt(i) - '0');
			int strInt_2 = (int) (str2.charAt(i) - '0');
			int sub = ( strInt_1 - strInt_2 - carry);	
			//System.out.println("str1Int: " + strInt_1 +  "str2Int: " + strInt_2 + "sub: " + sub );
			if (sub >= 0) {
				str += (char) (sub + '0');
				carry = 0;
			} else {
				str += (char) ((sub+10) + '0');
				carry = 1;
			}
			//System.out.println("str1Int: " + strInt_1 +  "str2Int: " + strInt_2 + "str: " + str );
		}

		// Add remaining digits of larger number
		for (int i = n2; i < n1; i++) {
			int sum = ((int) (str1.charAt(i) - '0') - carry);
			if (sum >= 0) {
				str += (char) (sum + '0');
				carry = 0;
			} else {
				str += (char) (-sum + '0');
				carry = 1;
			}
		}

		// reverse resultant String
		str = new StringBuilder(str).reverse().toString();
		int len = str.length();// 取得字符串的长度
		int index = 0;// 预定义第一个非零字符串的位置
		char strs[] = str.toCharArray();// 将字符串转化成字符数组
		for (int i = 0; i < len; i++) {
			if ('0' != strs[i]) {
				index = i;// 找到非零字符串并跳出
				break;
			}
		}
		
		String strLast = "0";
		if (index > 0) {
			strLast = str.substring(index, len);// 截取字符串
		}else {
			strLast = str;
		}
		//strLast = new StringBuilder(strLast).reverse().toString();

		if (flag)
			strLast = "-" + strLast;
		return strLast;
	}

	// Driver code
	public static void main(String[] args) {

		@SuppressWarnings("resource")
		Scanner in = new Scanner(System.in);
		int num = in.nextInt();

		String[] outs = new String[num];
		for (int i = 0; i < num; i++) {
			String a = in.next();
			String b = in.next();
			outs[i] = "Case " + (i + 1) + ":\n" + a + " - " + b + " = " + findSub(a, b);
		}

		for (String str : outs) {
			System.out.println(str);
			System.out.println();
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值