实现加法的时候按照4位为一个单位进行运算,之后的减法和乘法运算采用递归思想实现
import java.util.ArrayList;
public class BigData {
private String int_str;
public BigData(String str){
this.int_str = str;
}
public String getInt_str(){
return this.int_str;
}
// 输入字符串str, 返回字符串后四位代表的int数据a, 以及去除str字符串后四位之后的新的字符串b。返回为{a, b}
// 如果字符串str不足4位,则直接返回对应的int数据a,以及null值字符串b。返回为{a, b} (此时还需要单独判断str是否为空 "")
public ArrayList<Object> getObj(String str){
int a;
String b;
ArrayList<Object> list = new ArrayList<Object>();
if(str.length() <= 4) {
if (str.equals("")) {
a = 0;
} else {
a = Integer.parseInt(str);
}
b = "";
} else {
a = Integer.parseInt(str.substring(str.length()-4));
b = str.substring(0, str.length() -4 );
}
list.add(a);
list.add(b);
return list;
}
// 大数加法的实现
public BigData add(BigData bigData){
String final_result = "";
String str_x1 = this.getInt_str();
String str_x2 = bigData.getInt_str();
int x1 = 0;
int x2 = 0;
int temp = 0;
ArrayList<Object> list = null;
int carry = 0; //表示进位
while (!str_x1.equals("") || !str_x2.equals("")) {
list = getObj(str_x1);
x1 = (int) list.get(0);
str_x1 = (String) list.get(1);
list = getObj(str_x2);
x2 = (int) list.get(0);
str_x2 = (String) list.get(1);
temp = x1 + x2 + carry;
final_result = String.valueOf(temp % 10000) + final_result;
carry = temp/10000;
}
return new BigData(final_result);
}
// 比较两个字符串类型的大数哪个大, 如果str1 > str2 返回 1, 如果str1 == str2 返回 0, 如果str1 < str2 返回 -1
public int judge_big_or_small(String str_x1, String str_x2){
// 判断str_x1和str_x2哪个大
if (str_x1.length() > str_x2.length()) {
// 此时str_x1 肯定大
return 1;
} else if (str_x1.length() < str_x2.length()) {
// 此时str_x2 肯定大
return -1;
} else {
//此时需要比较str_x1和str_x2的首个字符哪个大(需要循环比较, 如果首字符相等,需要比较第二个字符)
int start = 0;
int end = 1;
while(start != str_x1.length()) {
// 如果start==字符串长度了,说明两个字符串比较到最后都是相等的,返回0
if (Integer.parseInt(str_x1.substring(start, end)) > Integer.parseInt(str_x2.substring(start, end))) {
// str_x1大
return 1;
} else if (Integer.parseInt(str_x1.substring(start, end)) > Integer.parseInt(str_x2.substring(start, end))) {
// str_x2大
return -1;
} else {
// 该字符相等
start ++;
end ++;
}
}
// 都退出while循环,表示两个字符串相等,输出0
return 0;
}
}
// 大数减法的实现
public BigData minus(BigData bigData) {
String str_x1 =getInt_str();
String str_x2 = bigData.getInt_str();
// 判断str_x1和str_x2哪个大
int judge = judge_big_or_small(str_x1, str_x2);
if (judge == 1) {
return new BigData(str_minus_str(str_x1, str_x2, 0));
} else if (judge == 0) {
return new BigData("0");
} else if (judge == -1) {
return new BigData("-" + str_minus_str(str_x2, str_x1, 0)); // 互换位置,并且添加符号
} else {
return new BigData("error");
}
}
// 大数乘法的实现
public BigData multiply(BigData bigData){
String final_result = "";
BigData final_data = new BigData(final_result);
String str_x1 = getInt_str();
String str_x2 = bigData.getInt_str();
String array_b[] = str_x2.split("");//切割字符串str_x2, 准备循环遍历
for (String b : array_b) {
final_data = final_data.add(new BigData(str_multiply_str(str_x1, Integer.parseInt(b), 0)));
}
return final_data;
}
// 大数除法的实现
public BigData exce(BigData bigData){
String final_result = "";
return new BigData(final_result);
}
// 默认减法a 大于 b, 结果一定是正的
// carry 判断是否需要从上一位借位
// 递归算字符串减法
public String str_minus_str(String a, String b, int carry){
if (a.length() == 1 && b.length() == 1) {
return String.valueOf(Integer.parseInt(a) - carry - Integer.parseInt(b));
} else if (b.length() == 1) {
// 此时a的长度定然大于等于2
String a_2 = a.substring(a.length()-2); // 获取a的后两位
String a_str = a.substring(0, a.length()-2); // 获取a去除后两位得到的字符串
return a_str + String.valueOf(Integer.parseInt(a_2) - carry - Integer.parseInt(b));
} else {
int x1 = Integer.parseInt(a.substring(a.length()-1)); //获取a的最后一位
int x2 = Integer.parseInt(b.substring(b.length()-1)); //获取b的最后一位
String str1 = a.substring(0, a.length() - 1); //获取a除去最后一位的所有字符串
String str2 = b.substring(0, b.length() - 1); //获取b除去最后一位的所有字符串
if(x1 < x2) {
// 需要借位的情况
return str_minus_str(str1, str2, 1) + String.valueOf(10 + x1 - x2 - carry);
} else {
return str_minus_str(str1, str2, 0) + String.valueOf(x1 - x2 - carry);
}
}
}
// 递归算字符串乘以一个数
public String str_multiply_str(String a, int b, int carry){
if (a.length() == 1) {
return String.valueOf(Integer.parseInt(a) * b + carry);
} else {
int last = Integer.parseInt(a.substring(a.length()-1)); //取出a的最后一位
String a_1 = a.substring(0, a.length()-1); // 去除a的最后一位得到的字符串
return str_multiply_str(a_1, b, last * b / 10) + String.valueOf(last * b % 10);
}
}
// 字符串相除递归得到商
// 这里的carry表示商当前的位数是否可以继续增加
public String str_excep_str (String a, String b, int carry) {
return "";
}
public static void main(String args[]){
// todo 验证加法
BigData bigData1 = new BigData("1234");
System.out.println(bigData1.add(new BigData("111")).getInt_str());
// todo 验证乘法
BigData bigData2 = new BigData("1234");
System.out.println(bigData2.minus(new BigData("111")).getInt_str());
// todo 验证乘法
BigData bigData3 = new BigData("12");
System.out.println(bigData3.multiply(new BigData("3")).getInt_str());
}
}