大数加减法

大数加减法模拟竖式计算的累加累减技巧,在数组中进行进位借位操作。时间复杂度都为O(1)

加法

减法

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package 高精度;

import java.util.Scanner;

public class test {

public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String a=in.next();String b=in.next();
in.close();
int longest=Math.max(a.length(), b.length());//最长位数的数字
int total[]=new int[longest+2]; //结果,考虑进位答案的长度最长为最长的数的长度+1
int c[]=new int [longest+5]; //这里为什么默认加5,因为可以多余的设置为零,利于核心式的累加累减不会越c,d的界
int d[]=new int[longest+5];
//a,b反转并存入数组,如123在数组中为0321,未填满的数字会默认为零,不会影响下面累加(如1234+34,数组中分别为0432104300
for(int i=1;i<=a.length();i++) {
c[i]=a.charAt(a.length()-i)-'0';
}
for(int i=1;i<=b.length();i++) {
d[i]=b.charAt(b.length()-i)-'0';
}
//累加核心式
for(int i=1;i<total.length-1;i++) {
total[i]+=c[i]+d[i];
total[i+1]+=total[i]/10;
total[i]%=10;
}

//减法核心式
//这里减法需要a>b,不然需要判断调换位置并在结果加以负号
/*
for(int i=1;i<total.length-1;i++) {
if(c[i]<d[i]) {
c[i+1]--;
c[i]+=10;
}
total[i]=c[i]-d[i];
}
*/
//去掉前面多余的零
int index=total.length-1;
while(total[index]==0 && index>1)
index--;
for(int i=index;i>=1;i--) {
System.out.print(total[i]);
}


}

}


大数加减法
https://lililib.github.io/大数加减法/
作者
煨酒小童
发布于
2020年12月15日
许可协议