1.前言
高精度主要用于C/C++中,两个比较的整数相加减,一大一小整数相乘除,范围大概是数的长度小于等于10的6次方。但是在java和Python中就用到的比较少了,因为java中有BigInteger的存在,位数是由内存决定的;而Python中就不限定位数
2.为什么要用高精度
当两个数向加或乘,位数已经超出long long 的范围,就会使数变得不准确,这时,我们就会想到用数组来存放一个数的大小,然后对数组进行操作,这样就很好的解决了问题
3.高精度加法
加法只要要主要进位就可以了
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 高精度加法 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String A=br.readLine();
String B=br.readLine();
System.out.println(add(A,B));
}
static String add(String A,String B){
int maxn=1000010; //根据题目要求更改
int[] a=new int[maxn]; //存放A
int[] b=new int[maxn]; //存放B
int[] c=new int[maxn]; //存放结果集
int len1=A.length()-1;
for (int i=0;i<A.length();i++) { //倒序放入数组
a[i]=Integer.parseInt(A.substring(len1,len1+1));
len1--;
}
int len2=B.length()-1;
for (int i=0;i<B.length();i++) { //倒序放入数组
b[i]=Integer.parseInt(B.substring(len2,len2+1));
len2--;
}
int jin=0;//进位
for (int i = 0; i <maxn ; i++) {
int he=a[i]+b[i]+jin;
c[i]=he%10;
jin=he/10;
}
int index=0;
for (int i = maxn-1; i >=0 ; i--) {
if (c[i]!=0){
index=i;
break;
}
}
String C="";
for (int i = index; i >=0 ; i--) {
C+=c[i];
}
return C;
}
}
4.高精度减法
输入的两个数,要保证A>=B,如果是小于,就交换A,B,最后加上“ - ” 就可以了,需要注意借位
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 高精度减法 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String A = br.readLine();
String B = br.readLine();
System.out.println(sub(A, B));
}
static String sub(String A, String B) {
if (A.equals(B)){
return "0";
}
int flag=0; //标记是否要加负号
int lena=A.length();
int lenb=B.length();
if (lena<lenb){ //说明A<B,交换A,B
String temp=A;
A=B;
B=temp;
flag=1;
}
if (lena==lenb){
int count=0;
while (count<lena){
int aa=Integer.parseInt(A.charAt(count)+"");
int bb=Integer.parseInt(B.charAt(count)+"");
if (aa<bb){
flag=1;
String temp=A;
A=B;
B=temp;
break;
}else if(aa>bb){
break;
}
count++;
}
}
int maxn = 1000010; //根据题目要求更改
int[] a = new int[maxn]; //存放A
int[] b = new int[maxn]; //存放B
int[] c = new int[maxn]; //存放结果集
int len1 = A.length() - 1;
for (int i = 0; i < A.length(); i++) { //倒序放入数组
a[i] = Integer.parseInt(A.substring(len1, len1 + 1));
len1--;
}
int len2 = B.length() - 1;
for (int i = 0; i < B.length(); i++) { //倒序放入数组
b[i] = Integer.parseInt(B.substring(len2, len2 + 1));
len2--;
}
for (int i = 0; i < maxn-1; i++) {
int cha = 0;
if (a[i] < b[i]) {
cha = a[i] - b[i] + 10;
a[i + 1]--; //借位处要减去1
} else {
cha = a[i] - b[i];
}
c[i] = cha;
}
int index = 0;
for (int i = maxn - 1; i >= 0; i--) {
if (c[i] != 0) {
index = i;
break;
}
}
String C = "";
for (int i = index; i >= 0; i--) {
C += c[i];
}
if (flag==1){
return "-"+C;
}
return C;
}
}
5.高精度乘法
A*b 把A的值放入数组里,把b看作一个整体,进行相乘
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 高精度乘法 {
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String A=br.readLine();
int b=Integer.parseInt(br.readLine());
System.out.println(mul(A,b));
}
static String mul(String A,int b){
int maxn=1000010; //根据题目要求更改
int[] a=new int[maxn]; //存放A
int[] c=new int[maxn]; //存放结果集
int len1=A.length()-1;
for (int i=0;i<A.length();i++) { //倒序放入数组
a[i]=Integer.parseInt(A.substring(len1,len1+1));
len1--;
}
int jin=0;//进位
for (int i = 0; i <maxn ; i++) {
int ji=a[i]*b+jin;
c[i]=ji%10;
jin=ji/10;
}
int index=0;
for (int i = maxn-1; i >=0 ; i--) {
if (c[i]!=0){
index=i;
break;
}
}
String C="";
for (int i = index; i >=0 ; i--) {
C+=c[i];
}
return C;
}
}
6.高精度除法
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
public class 高精度除法 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String A = br.readLine();
int b = Integer.parseInt(br.readLine());
System.out.println(div(A, b));
}
static String div(String A, int b) {
List<Integer> lista = new ArrayList<Integer>();
for (int i = A.length() - 1; i >= 0; i--) {
lista.add(Integer.parseInt(A.substring(i, i + 1)));
}
List<Integer> listc = new ArrayList<Integer>();
int r=0;
for (int i = lista.size()-1; i >=0 ; i--) {
r=r*10+lista.get(i);
listc.add(r/b);
r%=b;
}
String C="";
for (int i = 0; i <listc.size() ; i++) {
String tem=listc.get(i)+"";
C+=tem;
}
int index=0;
while (C.charAt(index)=='0'){
index++;
}
return C.substring(index);
}
}