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

实现加法的时候按照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());
    }
}























  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个基于NTL大数实现的大整加减乘除运算的C语言程序,供您参考: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include <NTL/ZZ.h> using namespace std; using namespace NTL; void print(ZZ x) { char *str = new char[1024]; BytesFromZZ((unsigned char*)str, x, 1024); printf("%s\n", str); delete[] str; } int main() { ZZ a, b, c, d, e; char *str_a = new char[1024]; char *str_b = new char[1024]; char *str_c = new char[1024]; char *str_d = new char[1024]; char *str_e = new char[1024]; const char *str_mod = "100000000000000000000000"; // 模为10^23 printf("请输入两个大整:\n"); scanf("%s %s", str_a, str_b); // 转换为大整 ZZFromBytes(a, (unsigned char*)str_a, strlen(str_a)); ZZFromBytes(b, (unsigned char*)str_b, strlen(str_b)); // 模加 c = (a + b) % conv<ZZ>(str_mod); printf("模加结果:"); print(c); // 模减 d = (a - b) % conv<ZZ>(str_mod); printf("模减结果:"); print(d); // 模乘 e = (a * b) % conv<ZZ>(str_mod); printf("模乘结果:"); print(e); // 模除 if (b == 0) { printf("除不能为0!\n"); } else { c = a / b; printf("模除结果:"); print(c); } delete[] str_a; delete[] str_b; delete[] str_c; delete[] str_d; delete[] str_e; return 0; } ``` 该程序首先使用NTL库中的ZZ类型表示大整,使用BytesFromZZ和ZZFromBytes函字符串转换为大整。然后使用+、-、*、/等运算符对大整进行模加、模减、模乘、模除运算,其中模为10^23。最后使用print函将结果输出到控制台。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值