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;
}
}
【算法】程序猿不写代码是不对的34
最新推荐文章于 2023-12-24 16:00:47 发布