在java中不使用大数,将两个大数作为字符串进行除法

在java中不使用大数,将两个大数作为字符串进行除法,java,algorithm,math,division,biginteger,Java,Algorithm,Math,Division,Biginteger,我需要在不使用Biginteger的情况下除法两个大整数,因为数字不能存储在基元类型中,因为我需要从给定的字符串逐字符进行除法,我已经创建了一个名为BigNumber的类,使用该类我可以: 加 倍增 比较两个内部有大整数的字符串 现在我只需要实现除法,但我不知道如何用两个字符串而不是一个字符串和一个Int来实现它,这是我到目前为止得到的结果,如果我们将字符串除以的数字足够小,可以成为Int,它就可以工作 class BigNumber { String Number; BigNumber

我需要在不使用Biginteger的情况下除法两个大整数,因为数字不能存储在基元类型中,因为我需要从给定的字符串逐字符进行除法,我已经创建了一个名为BigNumber的类,使用该类我可以:

  • 倍增
  • 比较两个内部有大整数的字符串
  • 现在我只需要实现除法,但我不知道如何用两个字符串而不是一个字符串和一个Int来实现它,这是我到目前为止得到的结果,如果我们将字符串除以的数字足够小,可以成为Int,它就可以工作

    class BigNumber {
        String Number;
    BigNumber div(BigNumber other) {
            String result= "";
            String num1= this.Number;
            long Divisor = Integer.parseInt(other.Number);
            int index = 0;
            long NumTemp = num1.charAt(index)-'0';
            while (NumTemp < Divisor){
                NumTemp = NumTemp * 10 +(num1.charAt(index+1) - '0');
                index++;
            }
            while (num1.length()-1 > index){
                result += (NumTemp/Divisor) ;
                NumTemp = (NumTemp % Divisor) * 10 + num1.charAt(index+1) - '0';
                index++;
            }
            result += (NumTemp/Divisor);
            System.out.println(result);
            System.out.println(NumTemp);
            BigNumber Big = new BigNumber(result);
            return Big;
        }
    }
    `
    
    类BigNumber{
    字符串编号;
    BigNumber分区(BigNumber其他){
    字符串结果=”;
    字符串num1=这个.Number;
    长除数=整数.parseInt(其他.Number);
    int指数=0;
    长NumTemp=num1.charAt(索引)-'0';
    while(NumTemp<除数){
    NumTemp=NumTemp*10+(num1.charAt(索引+1)-'0');
    索引++;
    }
    while(num1.length()-1>索引){
    结果+=(NumTemp/除数);
    NumTemp=(NumTemp%除数)*10+num1.charAt(索引+1)-“0”;
    索引++;
    }
    结果+=(NumTemp/除数);
    系统输出打印项次(结果);
    System.out.println(NumTemp);
    BigNumber大=新的BigNumber(结果);
    回归大;
    }
    }
    `
    

    PS:我的班级也可以将一个大数减去另一个大数,如果这有助于除法的话

    我尝试了你们今天早上告诉我的方法,并得到了它,谢谢大家,如果你们对它有一些改进,请告诉我,因为这只是一个粗略的代码,没有消除低效,谢谢大家

    BigNumber div(BigNumber other) {
                String result = "";
                String num1 = this.Number;
                String num2 = other.Number;
                int Select = num2.length();
                String temp = num1.substring(0, Select);
                BigNumber tempNum = new BigNumber(temp);
                int NumbersLeft = num1.length() - temp.length();
                BigNumber MultObject = new BigNumber("1");
                if (tempNum.compareTo(other) < 0) {
                    temp = num1.substring(0, Select+1);
                    tempNum.Number = temp;
                    NumbersLeft--;
                    Select++;
                }
                do {
                    MultObject.Number = "0";
                    int Index = 0;
                    while (other.mult(MultObject).compareTo(tempNum) < 0) {
                        Index++;
                        MultObject.Number = Integer.toString(Index);
                    }
                    Index--;
                    MultObject.Number = Integer.toString(Index);
                    String Carry = tempNum.sub(other.mult(MultObject)).Number;
                    if (NumbersLeft > 0) {
                        Select++;
                        Carry += num1.charAt(Select - 1);
                        NumbersLeft--;
                    }
                    result += Index;
                    tempNum.Number = Carry;
                }while (NumbersLeft > 0);
                MultObject.Number = "0";
                int Index = 0;
                while (other.mult(MultObject).compareTo(tempNum) < 0) {
                    Index++;
                    MultObject.Number = Integer.toString(Index);
                }
                Index--;
                MultObject.Number = Integer.toString(Index);
                String Carry = tempNum.sub(other.mult(MultObject)).Number;
                if (NumbersLeft > 0) {
                    Select++;
                    Carry += num1.charAt(Select - 1);
                    NumbersLeft--;
                }
                result += Index;
                tempNum.Number = Carry;
                    BigNumber Big = new BigNumber(result);
                    return Big;
                }
    
    BigNumber div(BigNumber其他){
    字符串结果=”;
    字符串num1=这个.Number;
    字符串num2=其他.Number;
    int Select=num2.length();
    字符串温度=num1。子字符串(0,选择);
    BigNumber tempNum=新的BigNumber(临时);
    int numberslft=num1.length()-temp.length();
    BigNumber MultObject=新的BigNumber(“1”);
    如果(与(其他)相比的临时数值小于0){
    temp=num1.子字符串(0,选择+1);
    tempNum.Number=temp;
    数字左--;
    选择++;
    }
    做{
    MultObject.Number=“0”;
    int指数=0;
    while(其他.mult(MultObject).compareTo(tempNum)<0){
    索引++;
    MultObject.Number=Integer.toString(索引);
    }
    索引--;
    MultObject.Number=Integer.toString(索引);
    字符串进位=tempNum.sub(other.mult(MultObject)).Number;
    如果(数字左>0){
    选择++;
    进位+=num1.charAt(选择-1);
    数字左--;
    }
    结果+=指数;
    tempNum.Number=进位;
    }而(数字左>0);
    MultObject.Number=“0”;
    int指数=0;
    while(其他.mult(MultObject).compareTo(tempNum)<0){
    索引++;
    MultObject.Number=Integer.toString(索引);
    }
    索引--;
    MultObject.Number=Integer.toString(索引);
    字符串进位=tempNum.sub(other.mult(MultObject)).Number;
    如果(数字左>0){
    选择++;
    进位+=num1.charAt(选择-1);
    数字左--;
    }
    结果+=指数;
    tempNum.Number=进位;
    BigNumber大=新的BigNumber(结果);
    回归大;
    }
    
    我不明白为什么需要使用字符而不是大整数……为什么不能使用
    biginger
    ?这就是课堂的目的,比如说,你在做十进制算术,所以通过加零和减法来移动除数。对剩下的部分重复一遍。这样他们就没有签名了?拿一支铅笔和一张纸以及两个大数字,可能是
    3456
    93876
    。使用学校教给你的长除法,把前者分为后者。仔细注意你所使用的算法,事实上,你可以把每一步都写下来。瞧