2011-02-14 62 views
0

我被告知我必须写一个BigInteger类,我知道有一个,但我必须自己写。我将采用整数或字符串,并将它们转换为数组来存储它们。从那里开始,我可以对这些数字进行加,减和乘。我已经把整数和字符串都做好了,并且让数组很好。我有其他问题。BigInteger需要帮助的作业

对于添加,我试图做一些检查数字类型数组的大小,然后设置哪些越来越小。从那里,我有它循环,直到它到达较小的一端,并且随着它循环它将两位数字的该部分的数字,并添加它们。现在可以,直到他们大于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; 
+1

对于所有三种操作(加法,减法和乘法),最简单的实现方法是实现您在小学时用于在纸上执行这些操作的相同算法。祝你好运! – 2011-02-14 04:15:10

+0

您是否向前或向后存储值?您的添加算法似乎从左向右添加,除非您将数字保存为反向,否则您使用的变体添加算法与您在小学时学到的算法略有不同,这是错误的。 – muddybruin 2011-02-14 04:33:52

+0

我有相反的数组中的数字,是的。 – Tempus35 2011-02-14 04:35:22

回答

1

如果它们的符号不同,则需要实际减去数字(并在适当的情况下借用)。此外,它看起来像你的携带功能不能运行超过较小数字的长度(携带“1”被覆盖)。

为了进一步进入的迹象,你有几个不同的情况(假设这是积极的和val为负这种情况下):

  1. 如果有多个数字,那么你要减val从这里,结果将是积极的
  2. 如果val有更多的数字,那么你会想从val中减去它,结果将是负数
  3. 如果他们有相同的数字位数,必须扫描以找出哪个更大(从最高有效位开始)。

当然,如果两者都是正数,那么您只需按正常方式添加,如果两者均为负数,则添加,然后将结果设置为负值。

2

,如果你知道如何add并用手multiply大的数字,用Java实现这些算法不会很困难。

0

我已经在几年前写了一个大数字库,如果有帮助,我可以在这里添加乘法代码。我对你的建议不是尝试自己编写这些功能。已经有已知的方法可以用bignumbers添加,减去,乘,除,powmod,xgcd等等。我记得我正在阅读布鲁斯·施奈尔的应用密码学书籍,以及兰德尔·海德的“装配艺术”。两者都有所需的算法来做到这一点(伪代码也)。我强烈建议你看看,特别是第二个,它是一个在线免费资源。

1

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

  • 相同长度,真正基本测试。
  • 长度相同,中间遗留。
  • 长度相同,末端遗留。
  • 相同的长度,残留在中间和结束时
  • 首先数较长,残留在中间和结束时
  • 第二数较长,残留在中间和结束时
  • 两个负数,第一个数字更长,在中间和末端结转

这一切工作得很好。 然而,当一个是积极的,一个是消极的,它不能正常工作。 这并不令人感到意外,因为-1 + 7实际上更像减法而不是加法。你应该把它想象成7-1,如果你检查这个案例而不是调用减法,它会容易得多。 同样,-1 - 1应该被视为加法,即使它看起来像减法。