BigInteger家庭作业需要帮助

时间:2011-02-14 04:10:27

标签: java biginteger

我被告知我必须写一个BigInteger类,我知道有一个,但我必须写自己的。我要采用整数或字符串并将它们转换为数组来存储它们。从那里我然后允许添加,减去和乘以数字。我有它的整数和字符串,并使阵列很好。我其余的都有问题。

对于add,我试图制作一些检查数字类型数组大小的东西,然后设置哪个越来越小。从那里我循环直到它到达较小的一端,并且当它循环时,它取数字的那一部分的数字为两个数字并添加它们。现在这可以,直到它们大于10,在这种情况下我需要携带一个数字。我想我也有同样的工作。

请记住我的BigInt有的两个东西是数字的数组和符号的int,1或-1。

所以在这种情况下,我遇到了添加权利和正确的标志的问题。与减法相同。

至于倍增,我完全迷失了,甚至没有尝试过。下面是我尝试过的一些代码:(添加功能),请帮助我。

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;

4 个答案:

答案 0 :(得分:2)

如果您手动了解如何addmultiply大数字,那么在Java中实现这些算法并不困难。

答案 1 :(得分:1)

如果他们的标志不同,你需要实际减去数字(并在适当时借用)。此外,看起来你的进位函数不能超过较小数字的长度(携带的“1”被覆盖)。

为了更进一步的迹象,你有几个不同的情况(假设这是积极的,val对这些情况是负面的):

  1. 如果这个数字更多,那么你需要从中减去val,结果将是正数
  2. 如果val有更多数字,那么你需要从val中减去这个数字,结果将为负数
  3. 如果它们具有相同的位数,则必须扫描以找到哪个更大(从最高位开始)。
  4. 当然如果两者都是正数,那么你只需正常添加,如果两者都是负数,则添加,然后将结果设置为负数。

答案 2 :(得分:1)

现在我们知道数字是反向存储的...... 我认为如果数字都具有相同的符号,您的代码将起作用。我尝试了以下测试用例:

  • 同样长度,非常基本的测试。
  • 相同的长度,在中间结转。
  • 相同长度,最后结转。
  • 相同长度,中间和末尾的结转
  • 第一个数字更长,结转中间和结尾
  • 第二个数字更长,中间和结尾都有结转
  • 负数,第一个数字较长,中间和结尾都有结转

这一切都很好。 但是,当一个是积极的而一个是消极的,它不能正常工作。 这并不太令人惊讶,因为-1 + 7实际上更像是减法而不是加法。你应该把它想象成7-1,如果你检查这种情况而不是调用减法,它会更容易。 同样,-1 - 1应该被认为是加法,即使它看起来像减法。

答案 3 :(得分:0)

几年前我实际上已经在大会上写了一个大数字库;如果有帮助,我可以在这里添加乘法代码。我给你的建议不是试着自己编写这些函数。已经知道用bignumber添加,减去,乘,除,powmod,xgcd等的方法。我记得我正在阅读布鲁斯施奈尔的“应用密码学”一书以及兰德尔·海德的“装配艺术”。两者都有所需的算法(也在伪代码中)。我强烈建议你看看,尤其是第二个,它是一个在线免费资源。