我被告知我必须写一个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;
答案 0 :(得分:2)
答案 1 :(得分:1)
如果他们的标志不同,你需要实际减去数字(并在适当时借用)。此外,看起来你的进位函数不能超过较小数字的长度(携带的“1”被覆盖)。
为了更进一步的迹象,你有几个不同的情况(假设这是积极的,val对这些情况是负面的):
当然如果两者都是正数,那么你只需正常添加,如果两者都是负数,则添加,然后将结果设置为负数。
答案 2 :(得分:1)
现在我们知道数字是反向存储的...... 我认为如果数字都具有相同的符号,您的代码将起作用。我尝试了以下测试用例:
这一切都很好。 但是,当一个是积极的而一个是消极的,它不能正常工作。 这并不太令人惊讶,因为-1 + 7实际上更像是减法而不是加法。你应该把它想象成7-1,如果你检查这种情况而不是调用减法,它会更容易。 同样,-1 - 1应该被认为是加法,即使它看起来像减法。
答案 3 :(得分:0)
几年前我实际上已经在大会上写了一个大数字库;如果有帮助,我可以在这里添加乘法代码。我给你的建议不是试着自己编写这些函数。已经知道用bignumber添加,减去,乘,除,powmod,xgcd等的方法。我记得我正在阅读布鲁斯施奈尔的“应用密码学”一书以及兰德尔·海德的“装配艺术”。两者都有所需的算法(也在伪代码中)。我强烈建议你看看,尤其是第二个,它是一个在线免费资源。