【算法】程序猿不写代码是不对的34

package com.kingdz.algorithm.time201703;

/**
 * 大整数加减法
 * 
 * @author kingdz
 * 
 */
public class Algo21 {

	public static void main(String[] args) {

		Bigint a = new Bigint();
		a.setNumber("1234567");
		Bigint b = new Bigint();
		b.setNumber("9456789");
		Bigint c = minus(a, b);
		System.out.println(c);
	}

	/**
	 * 大整数减法
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static Bigint minus(Bigint a, Bigint b) {
		if (a.isPositive() && b.isPositive()) {
			// 都是正数
			int big = a.compareAbs(b);
			if (big == 0) {
				Bigint c = new Bigint();
				c.setNumber("0");
				return c;
			} else if (big == 1) {
				// 被减数较大
				String strA = a.getNumber();
				String strB = b.getNumber();
				int indexA = strA.length() - 1;
				int indexB = strB.length() - 1;
				int carry = 0;
				StringBuilder strb = new StringBuilder();
				while (indexA != -1 && indexB != -1) {
					int inta = Integer.parseInt("" + strA.charAt(indexA));
					int intb = Integer.parseInt("" + strB.charAt(indexB));
					inta = inta - carry;
					if (inta >= intb) {
						inta = inta - intb;
						carry = 0;
					} else {
						inta = intb - inta;
						carry = 1;
					}
					strb.append(inta);
					indexA--;
					indexB--;
				}
				if (indexA == -1) {
					for (int i = indexB; i >= 0; i--) {
						int intb = Integer.parseInt("" + strB.charAt(i)) - carry;
						carry = 0;
						strb.append(intb);
					}
				} else {
					for (int i = indexA; i >= 0; i--) {
						int inta = Integer.parseInt("" + strA.charAt(i)) - carry;
						carry = 0;
						strb.append(inta);
					}
				}
				strb = strb.reverse();
				Bigint c = new Bigint();
				c.setNumber(strb.toString());
				return c;
			} else {
				// 减数较大,结果为负数
				Bigint c = minus(b, a);
				c.setPositive(false);
				return c;
			}
		} else if ((!a.isPositive()) && (!b.isPositive())) {
			// 都是负数
			a.setPositive(true);
			b.setPositive(true);
			return minus(b, a);
		} else {
			if (a.isPositive()) {
				b.setPositive(true);
				return add(a, b);
			} else {
				a.setPositive(true);
				b.setPositive(true);
				Bigint c = add(a, b);
				c.setPositive(false);
				return c;
			}
		}
	}

	/**
	 * 大整数加法
	 * 
	 * @param a
	 * @param b
	 * @return
	 */
	public static Bigint add(Bigint a, Bigint b) {
		if (a.isPositive() && b.isPositive()) {
			// 都是正数
			char[] charA = a.getNumber().toCharArray();
			char[] charB = b.getNumber().toCharArray();

			StringBuilder strb = new StringBuilder();
			int carry = 0;
			int indexA = charA.length - 1;
			int indexB = charB.length - 1;
			while (indexA != -1 && indexB != -1) {
				int inta = Integer.parseInt("" + charA[indexA]);
				int intb = Integer.parseInt("" + charB[indexB]);
				inta = inta + intb + carry;
				if (inta >= 10) {
					carry = inta / 10;
					inta = inta % 10;
				} else {
					carry = 0;
				}
				strb.append(inta);
				indexA--;
				indexB--;
			}
			if (indexA == -1) {
				for (int i = indexB; i >= 0; i--) {
					int intb = Integer.parseInt("" + charB[i]) + carry;
					if (intb >= 10) {
						carry = intb / 10;
						intb = intb % 10;
					} else {
						carry = 0;
					}
					strb.append(intb);
				}
			} else {
				for (int i = indexA; i >= 0; i--) {
					int inta = Integer.parseInt("" + charA[i]) + carry;
					if (inta >= 10) {
						carry = inta / 10;
						inta = inta % 10;
					} else {
						carry = 0;
					}
					strb.append(inta);
				}
			}

			if (carry != 0) {
				strb.append(carry);
			}
			strb = strb.reverse();
			Bigint c = new Bigint();
			c.setNumber(strb.toString());
			return c;
		} else if ((!a.isPositive()) && (!b.isPositive())) {
			// 都是负数
			a.setPositive(true);
			b.setPositive(true);
			Bigint c = add(a, b);
			c.setPositive(false);
			return c;
		} else {
			// 符号相异
			if (a.isPositive()) {
				b.setPositive(true);
				return minus(a, b);
			} else {
				a.setPositive(true);
				return minus(b, a);
			}
		}
	}
}

class Bigint {

	// 存储整数
	private String number;
	// 存储符号
	private boolean positive = true;

	public Bigint() {

	}

	public Bigint(String number) {
		super();
		this.positive = true;
		this.number = number;
	}

	/**
	 * 带符号比较
	 * 
	 * @param b
	 * @return
	 */
	public int compare(Bigint b) {
		if (!(positive && b.positive)) {
			if (positive) {
				return 1;
			} else {
				return -1;
			}
		}

		if (positive) {
			return compareAbs(b);
		} else {
			return -1 * compareAbs(b);
		}
	}

	/**
	 * 绝对值比较
	 * 
	 * @param b
	 * @return
	 */
	public int compareAbs(Bigint b) {
		if (number.length() > b.number.length()) {
			return 1;
		} else if (number.length() < b.number.length()) {
			return -1;
		} else {
			for (int i = 0; i < number.length(); i++) {
				int a = Integer.parseInt("" + number.charAt(i));
				int c = Integer.parseInt("" + b.number.charAt(i));
				if (a > c) {
					return 1;
				} else if (a < c) {
					return -1;
				}
			}
			return 0;
		}
	}

	@Override
	public String toString() {
		if (positive) {
			return number;
		} else {
			return "-" + number;
		}
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public boolean isPositive() {
		return positive;
	}

	public void setPositive(boolean positive) {
		this.positive = positive;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值