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

来源:互联网 发布:淘宝优惠券推广软件 编辑:程序博客网 时间:2024/06/06 13:10
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;}}@Overridepublic 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;}}

0 0