package com.interview.flag.g;
/**
* Created_By: stefanie
* Date: 15-1-26
* Time: 下午5:33
*/
public class G33_BigInteger {
private boolean positive = true;
private String number = "0";
public G33_BigInteger(String number){
if(number.charAt(0) == '-') {
positive = false;
this.number = number.substring(1);
} else this.number = number;
}
private int getBitNumber(int index){
if(index < 0 || index >= number.length()) return 0;
else return number.charAt(index) - '0';
}
public String toString(){
return positive ? number : "-" + number;
}
public G33_BigInteger add(G33_BigInteger num){
if(!positive && num.positive) return num.minus(new G33_BigInteger(number));
else if(positive && !num.positive) return this.minus(new G33_BigInteger(num.number));
StringBuffer buffer = new StringBuffer();
int len1 = number.length();
int len2 = num.number.length();
int maxLen = Math.max(len1, len2);
int carry = 0;
for(int i = 1; i <= maxLen; i++){
int sum = getBitNumber(len1 - i) + num.getBitNumber(len2 - i) + carry;
carry = sum / 10;
buffer.insert(0, sum % 10);
}
if(carry != 0) buffer.insert(0, carry);
G33_BigInteger result = new G33_BigInteger(buffer.toString());
if(!positive && !num.positive) result.positive = false;
return result;
}
public G33_BigInteger minus(G33_BigInteger num){
if(!positive && num.positive) return this.add(new G33_BigInteger("-" + num.number));
else if(positive && !num.positive) return this.add(new G33_BigInteger(num.number));
else if(!positive && !num.positive) return new G33_BigInteger(num.number).minus(new G33_BigInteger(number));
StringBuffer buffer = new StringBuffer();
int len1 = number.length();
int len2 = num.number.length();
int maxLen = Math.max(len1, len2);
int carry = 0;
for(int i = 1; i <= maxLen; i++){
int result = getBitNumber(len1 - i) - carry - num.getBitNumber(len2 - i);
if(result < 0){
carry = 1;
result += 10;
} else {
carry = 0;
}
buffer.insert(0, result);
}
if(carry == 1) {
G33_BigInteger result = num.minus(this);
result.positive = false;
return result;
}
while(buffer.length() > 1 && buffer.charAt(0) == '0') buffer.deleteCharAt(0);
return new G33_BigInteger(buffer.toString());
}
public G33_BigInteger multiply(G33_BigInteger num){
int len1 = number.length();
int len2 = num.number.length();
int[] num3 = new int[len1 + len2];
int carry = 0;
for(int i = len1 - 1; i >= 0; i--){
carry = 0;
for(int j = len2 - 1; j >= 0; j--){
int sum = num3[i + j + 1] + carry + getBitNumber(i) * num.getBitNumber(j);
num3[i + j + 1] = sum % 10;
carry = sum / 10;
}
num3[i] = carry;
}
StringBuffer buffer = new StringBuffer();
int offset = 0;
while(offset < len1 + len2 - 1 && num3[offset] == 0) offset++;
while(offset < len1 + len2) buffer.append(num3[offset++]);
G33_BigInteger result = new G33_BigInteger(buffer.toString());
if(positive ^ num.positive) result.positive = false;
return result;
}
public static void main(String[] args){
G33_BigInteger number1 = new G33_BigInteger("123");
G33_BigInteger number2 = new G33_BigInteger("48");
G33_BigInteger number3 = new G33_BigInteger("-231");
System.out.println(number1.add(number2)); //171
System.out.println(number1.minus(number2)); //75
System.out.println(number2.minus(number2)); //0
System.out.println(number1.minus(number3)); //354
System.out.println(number1.add(number3)); //-108
System.out.println(number1.multiply(number2)); //5904
System.out.println(number1.multiply(number3)); //-28413
}
}