实现大数(字符串类型)的加减乘除运算

实现加法的时候按照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 getObj(String str){
        int a;
        String b;
        ArrayList list = new ArrayList();
        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 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());
    }
}






















 
  

你可能感兴趣的:(实现大数(字符串类型)的加减乘除运算)