大数加减法模拟竖式计算的累加累减技巧,在数组中进行进位借位操作。时间复杂度都为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,数组中分别为04321 和04300) 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,不然需要判断调换位置并在结果加以负号
//去掉前面多余的零 int index=total.length-1; while(total[index]==0 && index>1) index for(int i=index;i>=1;i System.out.print(total[i]); } }
}
|