java中的高精度加减乘除
1、高精度加法
用代码体现运算过程
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class Main{
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String a = bf.readLine();
String b = bf.readLine();
List<Integer> list = add(a , b);
for(int i = list.size()-1;i>=0;i--){
System.out.print(list.get(i));
}
}
public static List<Integer> add(String a, String b){
int i = a.length()-1;
int j = b.length()-1;
List<Integer> res = new ArrayList<>();
int t = 0;
for(;i>=0||j>=0 ;i--,j--){
t+=(i>=0?a.charAt(i)-'0':0)+(j>=0?b.charAt(j)-'0':0);
res.add(t%10);
t = t/10;
}
if(t!=0)res.add(t);
return res;
}
}
高精度加法思路
用中间变量t表示进位情况,t%10为当前位的值,t/10为下一位的进位情况
值得一提的是,高精度储存结果中是下标值小的存储位数低的,也就是从个位开始存,取得时候需要从高位开始取。
2、高精度减法
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class GaoJingJian {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
String a = bf.readLine();
String b = bf.readLine();
ArrayList<Integer> aa = new ArrayList<>();
ArrayList<Integer> bb = new ArrayList<>();
for(int i = a.length()-1;i>=0;i--){
aa.add(a.charAt(i)-'0');
}
for(int i = b.length()-1;i>=0;i--){
bb.add(b.charAt(i)-'0');
}
if(check(a , b)){
List<Integer> cc = sub(aa , bb);
for(int i = cc.size()-1;i>=0;i--){
System.out.print(cc.get(i));
}
}else {
List<Integer> cc = sub(bb , aa);
System.out.print('-');
for(int i = cc.size()-1;i>=0;i--){
System.out.print(cc.get(i));
}
}
}
public static boolean check(String a , String b){
if(a.length()!=b.length()){
return a.length()>b.length();
}
for(int i = 0;i<a.length();i++){
if(a.charAt(i)!=b.charAt(i)){
return a.charAt(i)>b.charAt(i);
}
}
return true;
}
public static List<Integer> sub(ArrayList<Integer> a , ArrayList<Integer> b){
List<Integer> list = new ArrayList<>();
for(int i = 0 , t = 0;i<a.size();i++){
t = a.get(i) - t;
if(i<b.size()) t = t - b.get(i);
list.add((t+10)%10);
if(t<0) t = 1;else t = 0;
}
int i = list.size()-1;
while(i>0){
if(list.get(i)==0){
i--;
}else break;
}
return list.subList(0 , i+1);
}
}
高精度减法思路
首先判断两个数大小,通过判断结果决定是否输出负号
然后利用一个变量t表示向前借位,(t+10)%10,如果t为整数,那么该数不变,最后将该数赋值为0,如果t为负数,那么该数成功向前一位借位,最后将该数赋值为1。
最后去除前导零。
3、高精度乘法
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine();
int bb = Integer.valueOf(br.readLine());
ArrayList<Integer> aa = new ArrayList<Integer>();
for (int i = a.length() - 1; i >= 0; i--){
aa.add(a.charAt(i) - '0');
}
ArrayList<Integer> c = add2(aa,bb);
boolean t = true;
for(int k = c.size() - 1; k >= 0 ; k--){
if(c.get(k) == 0 && t && k >= 1) continue;
System.out.print(c.get(k));
t = false;
}
}
public static ArrayList<Integer> add2(ArrayList<Integer> aa, int bb){
ArrayList<Integer> c = new ArrayList<Integer>();
int t = 0;
for(int i = 0; i < aa.size(); i++){
t += aa.get(i) * bb;
c.add((t % 10));
t /= 10;
}
if (t > 0) c.add(t);
int i = 0;
return c;
}
}
高精度乘法思路
乘法和除法与加减法思路不一样的地方在于,传入的两个参数一个是高精度,一个是低精度,高精度参数用集合表示,用每一位的数字去乘以低精度数,并将个位存入结果集。与加法思路大概一殊途同归。
4、高精度除法
import java.io.*;
import java.util.*;
public class Main{
static int r = 0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String a = br.readLine();
int bb = Integer.valueOf(br.readLine());
ArrayList<Integer> aa = new ArrayList<Integer>();
for (int i = a.length() - 1; i >= 0; i--){
aa.add(a.charAt(i) - '0');
}
ArrayList<Integer> c = add2(aa,bb);
boolean t = true;
for(int k = 0; k <c.size() ; k++){
if(c.get(k) == 0 && t && k <c.size()-1) continue;
System.out.print(c.get(k));
t = false;
}
System.out.println();
System.out.println(r);
}
public static ArrayList<Integer> add2(ArrayList<Integer> aa, int bb ){
ArrayList<Integer> c = new ArrayList<Integer>();
for(int i = aa.size()-1;i>=0;i--){
r = r*10 + aa.get(i);
c.add(r/bb);
r %=bb;
}
return c;
}
}
高精度除法思路
从高位开始除以除数,r到最后表示余数。
5、java中BigInteger与BigDecimal的高精度加减乘除
BigIneger处理整数运算:
import java.math.BigInteger;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BigInteger a = new BigInteger(reader.readLine());
BigInteger b = new BigInteger(reader.readLine());
//加法
System.out.println(a.add(b));
//减法
System.out.println(a.subtract(b));
//乘法
System.out.println(a.multiply(b));
//除法
System.out.println(a.divide(b));
//返回值为a/b
System.out.println(a.divideAndRemainder(b));
//返回值为数组,分别为a/b,a%b
reader.close();
}
}
BigDecimal处理浮点数运算:
import java.io.*;
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
BigDecimal a = new BigDecimal(reader.readLine());
BigDecimal b = new BigDecimal(reader.readLine());
//加法
System.out.println(a.add(b));
//减法
System.out.println(a.subtract(b));
//乘法
System.out.println(a.multiply(b));
//除法
System.out.println(a.divide(b));
reader.close();
}
}
评价:还是BigInteger和BigDecimal好用,但如果考试中禁用了这两个类的话,高精度运算的思路也要会。