Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要家庭作业帮助吗_Java_Biginteger - Fatal编程技术网

Java 需要家庭作业帮助吗

Java 需要家庭作业帮助吗,java,biginteger,Java,Biginteger,有人告诉我必须写一个BigInteger类,我知道有一个,但我必须自己写。我将获取整数或字符串,并将它们转换为数组来存储它们。从那个里我就可以允许数字的加、减、乘。我让它接受整数和字符串,并制作数组,这很好。我和其他人有问题 对于add,我尝试了一些东西来检查数字类型数组的大小,然后设置越小越大的数组。从那里我让它循环,直到它到达较小的一个的末尾,当它循环时,它取数组中该部分的数字作为两个数字,并将它们相加。现在这是确定的,直到它们大于10,在这种情况下,我需要携带一个数字。我想我也有过这样的经

有人告诉我必须写一个BigInteger类,我知道有一个,但我必须自己写。我将获取整数或字符串,并将它们转换为数组来存储它们。从那个里我就可以允许数字的加、减、乘。我让它接受整数和字符串,并制作数组,这很好。我和其他人有问题

对于add,我尝试了一些东西来检查数字类型数组的大小,然后设置越小越大的数组。从那里我让它循环,直到它到达较小的一个的末尾,当它循环时,它取数组中该部分的数字作为两个数字,并将它们相加。现在这是确定的,直到它们大于10,在这种情况下,我需要携带一个数字。我想我也有过这样的经历

请记住,我的BigInt有两个特性,一个是数字数组,另一个是符号int,1或-1

因此,在这种情况下,我有问题,它添加权利和标志是正确的。减法也一样

至于乘法,我完全不懂,甚至还没试过。下面是我尝试过的一些代码:(add函数),请帮助我

public BigInt add(BigInt val){

        int[] bigger;
        int[] smaller;
        int[] dStore;
        int carryOver = 0;
        int tempSign = 1;

        if(val.getSize() >= this.getSize()){
            bigger = val.getData();
            smaller = this.getData();

            dStore = new int[val.getSize()+2];

            if(val.getSign() == 1){
                tempSign = 1;
            }else{
                tempSign = -1;
            }

        }else{

            bigger = this.getData();
            smaller = val.getData();

            dStore = new int[this.getSize()+2];

            if(this.getSign() == 1){
                tempSign = 1;
            }else{
                tempSign = -1;
            }
        }


        for(int i=0;i<smaller.length;i++){
            if((bigger[i] < 0 && smaller[i] < 0) || (bigger[i] >= 0 && smaller[i] >= 0)){
                dStore[i] = Math.abs(bigger[i]) + Math.abs(smaller[i]) + carryOver;
            }else if((bigger[i] <= 0 || smaller[i] <= 0) && (bigger[i] > 0 || smaller[i] > 0)){
                dStore[i] = bigger[i] + smaller[i];
                dStore[i] = Math.abs(dStore[i]);
            }
            if(dStore[i] >= 10){
                dStore[i] = dStore[i] - 10;
                if(i == smaller.length - 1){
                    dStore[i+1] = 1;
                }
                carryOver = 1;
            }else{
                carryOver = 0;
            }
        }

        for(int i = smaller.length;i<bigger.length;i++){
            dStore[i] = bigger[i];
        }

        BigInt rVal = new BigInt(dStore);
        rVal.setSign(tempSign);

        return rVal;
公共BigInt添加(BigInt val){
int[]更大;
int[]更小;
int[]数据存储;
int结转=0;
int-tempSign=1;
如果(val.getSize()>=this.getSize()){
biger=val.getData();
较小=this.getData();
dStore=newint[val.getSize()+2];
if(val.getSign()==1){
tempSign=1;
}否则{
tempSign=-1;
}
}否则{
biger=this.getData();
较小=val.getData();
dStore=newint[this.getSize()+2];
if(this.getSign()==1){
tempSign=1;
}否则{
tempSign=-1;
}
}
对于(int i=0;i=0和更小[i]>=0)){
dStore[i]=Math.abs(较大[i])+Math.abs(较小[i])+结转;
}else if((大于[i]0)){
d存储[i]=较大[i]+较小[i];
dStore[i]=Math.abs(dStore[i]);
}
如果(数据存储[i]>=10){
dStore[i]=dStore[i]-10;
如果(i==更小的长度-1){
d存储区[i+1]=1;
}
结转率=1;
}否则{
结转率=0;
}
}

对于(int i=更小的.length;i如果你知道如何手动输入和输入大数字,用Java实现这些算法将不会困难。

如果你知道如何手动输入和输入大数字,用Java实现这些算法将不会困难。

几年前我实际上已经在汇编中编写了一个大数字库;我可以添加乘法如果有帮助,请在此处编写代码。我给你的建议是不要尝试自己编写函数。已有已知的方法可以使用大数进行加法、减法、乘法、除法、powmod、xgcd等。我记得我读过Bruce Schneier的《应用密码学》一书和Randall Hyde的《汇编艺术》。这两种方法都有必要的算法s这样做(也使用伪代码)。我强烈建议你看一看,尤其是第二个,它是一个在线免费资源。

几年前我实际上在汇编中编写了一个大的数字库;如果有帮助,我可以在这里添加乘法代码。我的建议是不要尝试自己编写函数。已经有已知的添加方法,substr使用大数进行运算、乘法、除法、powmod、xgcd等。我记得我读过Bruce Schneier的《应用密码学》一书,以及Randall Hyde的《汇编艺术》。这两本书都有实现这一点所需的算法(也有伪代码)。我强烈建议你看一看,尤其是第二个,它是一个在线免费资源。

如果它们的符号不同,你需要实际减去数字(并在适当的情况下借用)。此外,看起来你的进位函数无法将较小数字的长度进位(进位的“1”会被覆盖)

为了更深入地了解信号,您有几个不同的情况(假设这些情况下,这是正的,val是负的):

  • 如果这有更多的数字,那么您需要从中减去val,结果将为正
  • 如果val有更多的数字,那么您需要从val中减去它,结果将是负数
  • 如果它们的位数相同,则必须进行扫描,以找出哪个更大(从最高有效位开始)

  • 当然,如果两个数字都是正数,那么你只需按正常情况进行加法,如果两个数字都是负数,那么就将结果设置为负数。

    如果它们的符号不同,你需要实际减去数字(如果合适的话,还需要借用)。此外,看起来你的进位函数无法通过较小数字的长度(进位)“1”将被覆盖)

    为了更深入地了解信号,您有几个不同的情况(假设这些情况下,这是正的,val是负的):

  • 如果这有更多的数字,那么您需要从中减去val,结果将为正
  • 如果val有更多的数字,那么您需要从val中减去它,结果将是负数
  • 如果它们的位数相同,则必须进行扫描,以找出哪个更大(从最高有效位开始)

  • 当然,如果两者都是正数,则只需按正常值相加,如果两者都是负数,则将结果设置为负数。

    现在我们知道数字是以相反的方式存储的。。。 我认为如果两个数字都有相同的符号,您的代码就可以工作。我尝试了以下测试用例:

    • 同样的长度,真正的基本测试
    • 长度相同,中间携带。
    • 相同长度,在