大數相加,大數相減(Java版)

package cn.yunmanage.haikang;

public class BigNumberAdd {
	public static void main(String[] args) {
		System.out.println(bigNumberAdd("111", "999"));
	}

	public static String bigNumberAdd(String f, String s) {
		// 翻轉兩個字符串,並轉換成數組
		char[] a = new StringBuffer(f).reverse().toString().toCharArray();
		char[] b = new StringBuffer(s).reverse().toString().toCharArray();
		int lenA = a.length;
		int lenB = b.length;
		// 計算兩個長字符串中的較長字符串的長度
		int len = lenA > lenB ? lenA : lenB;
		int[] result = new int[len + 1];// 長度爲len+1(由於可能有進位)
		for (int i = 0; i < len + 1; i++) {
			// 若是當前的i超過了其中的一個,就用0代替,和另外一個字符數組中的數字相加
			int aint = i < lenA ? (a[i] - '0') : 0;
			int bint = i < lenB ? (b[i] - '0') : 0;
			result[i] = aint + bint;
		}
		// 處理結果集合,若是大於等於10的就向前一位進位,自己進行除10取餘
		for (int i = 0; i < result.length; i++) {
			if (result[i] >= 10) {
				result[i + 1] += result[i] / 10;
				result[i] %= 10;
			}
		}
		StringBuffer sb = new StringBuffer();
		// 該字段用於標識是否有前置0,若是有就不要存儲
		boolean flag = true;
		for (int i = len; i >= 0; i--) {
			if (result[i] == 0 && flag) {
				continue;
			} else {
				flag = false;
			}
			sb.append(result[i]);
		}
		return sb.toString();
	}
}

package cn.yunmanage.haikang;

public class BigNumberSub {
	public static void main(String[] args) {
		System.out.println(bigNumberSub02("99", "2222"));
	}

	public static String bigNumberSub(String f, String s) {
		System.out.print("減法:" + f + "-" + s + "=");
		// 將字符串翻轉並轉換成字符數組
		char[] a = new StringBuffer(f).reverse().toString().toCharArray();
		char[] b = new StringBuffer(s).reverse().toString().toCharArray();
		int lenA = a.length;
		int lenB = b.length;
		// 找到最大長度
		int len = lenA > lenB ? lenA : lenB;
		int[] result = new int[len];
		// 表示結果的正負
		char sign = '+';
		// 判斷最終結果的正負
		if (lenA < lenB) {
			sign = '-';
		} else if (lenA == lenB) {
			int i = lenA - 1;
			while (i > 0 && a[i] == b[i]) {
				i--;
			}
			if (a[i] < b[i]) {
				sign = '-';
			}
		}
		// 計算結果集,若是最終結果爲正,那麼就a-b不然的話就b-a
		for (int i = 0; i < len; i++) {
			int aint = i < lenA ? (a[i] - '0') : 0;// 將字符串轉爲數字,以最長的爲準,不夠的補0
			int bint = i < lenB ? (b[i] - '0') : 0;
			if (sign == '+') {
				result[i] = aint - bint;
			} else {
				result[i] = bint - aint;
			}
		}
		// 若是結果集合中的某一位小於零,那麼就向前一位借一,而後將本位加上10。其實就至關於借位作減法
		for (int i = 0; i < result.length - 1; i++) {
			if (result[i] < 0) {
				result[i + 1] -= 1;
				result[i] += 10;
			}
		}

		StringBuffer sb = new StringBuffer();
		// 若是最終結果爲負值,就將負號放在最前面,正號則不須要
		if (sign == '-') {
			sb.append('-');
		}
		// 判斷是否有前置0
		boolean flag = true;
		for (int i = len - 1; i >= 0; i--) {
			if (result[i] == 0 && flag) {
				continue;
			} else {
				flag = false;
			}
			sb.append(result[i]);
		}
		// 若是最終結果集合中沒有值,就說明是兩值相等,最終返回0
		if (sb.toString().equals("")) {
			sb.append("0");
		}
		// 返回值
		System.out.println(sb.toString());
		return sb.toString();
	}
}
相關文章
相關標籤/搜索