javaBigInteger实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

javaBigInteger实现BigInteger底层是⽤int[]实现的。

之前看数据结构,⼀直以为BigInteger是⽤链表实现的。但后来发现那只是练习时增加难度所⽤。之后发现⽤String实现⽐链表不知道快了多少倍。就以为是⽤String实现。

可是⼀查,才发现原来使⽤int[]实现的。

是啊,⽤int[]就省去了字符转数字的⿇烦!

下⾯给出⽤String实现的加和乘算法。思路和我们⼿算是⼀样的。

public String mulOneDigit(String num1, char digit, int level){

StringBuilder sb = new StringBuilder();

int carry = 0;

for (int i = num1.length()-1; i >= 0 || carry != 0; i--){

int tmp = i < 0 ? 0 : num1.charAt(i) - '0';

sb.insert(0, (tmp * (digit-'0') + carry) % 10);

carry = (tmp * (digit-'0') + carry) / 10;

}

while (level > 0){

sb.append(0);

level--;

}

return sb.toString();

}

/**

* ⽤ ?: 来规避两段循环,并注意最⾼位进⼀的情况

* @param num1

* @param num2

* @return

*/

public String add(String num1, String num2){

StringBuilder sb = new StringBuilder();

int carry = 0;

for (int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j>=0 || carry != 0; i--, j--){

int a = i < 0 ? 0 : num1.charAt(i) - '0';

int b = j < 0 ? 0 : num2.charAt(j) - '0';

sb.insert(0, (a+b+carry) % 10);

carry = (a+b+carry)/10;

}

return sb.toString();

}

public String multiply(String num1, String num2) {

String small, large;

if (num1.length() > num2.length()){

large = num1;

small = num2;

}else {

large = num2;

small = num1;

}

List<String> stringList = new ArrayList<>();

int level = 0;

for (int i = small.length()-1; i >= 0 ; i--) {

stringList.add(mulOneDigit(large, small.charAt(i), level++));

}

String result = "0";

for (String str : stringList){

result = add(str, result);

}

if (result.charAt(0) == '0'){

result = "0";

}

return result;

}

相关文档
最新文档