简要:
以下是我对高精度模板的总结,只有乘法和加法用了底层原理,底层原理是用c++来实现的,其余的采用的是stl方法,都是用Java来实现的。
高精度加法1:
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args){
String t1;
String t2;
Scanner scan = new Scanner(System.in);
t1 = scan.next();
t2 = scan.next();
BigInteger s1 = new BigInteger(t1);
BigInteger s2 = new BigInteger(t2);
System.out.println(s1.add(s2));
}
}
高精度加法2:
#include<bits/stdc++.h>
using namespace std;
stack<int> add(string a,string b){
stack<int> s;
int t=0;
for(int i=a.size()-1,j=b.size()-1;i>=0||j>=0;i--,j--){
if(i>=0) t=t+a[i]-'0';
if(j>=0) t=t+b[j]-'0';
s.push(t%10);
t=t/10;
}
if(t!=0){
s.push(t);
}
return s;
}
int main(){
string a,b;
stack<int> s;
cin>>a>>b;
s=add(a,b);
while(s.empty()==false){
cout<<s.top();
s.pop();
}
return 0;
高精度减法1:
import java.math.BigInteger;
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
String b = scanner.next();
BigInteger s1 = new BigInteger(a);
BigInteger s2 = new BigInteger(b);
BigInteger s3 = s1.subtract(s2);
System.out.println(s3);
}
}
高精度减法2:
#include <iostream>
#include <vector>
using namespace std;
bool cmp(vector<int> A, vector<int> B) {
int flag=1; //定义一个AB是否相等的印记。
if (A.size() != B.size()){
return A.size() > B.size();
}
for (int i = A.size() - 1; i >= 0; --i){
if (A[i] != B[i]){
flag=0;
return A[i]>B[i];
}
}
if(flag==1){
return true;
}
}
vector<int> sub(vector<int>& A, vector<int>& B) {
vector<int> ans;
for(int i=0;i<B.size();i++){
if(A[i]>=B[i]){
ans.push_back(A[i]-B[i]);
}
else{
ans.push_back(A[i]-B[i]+10);
A[i+1]--;
}
}
//超出B的长度,处理借位后的变化。
for(int i=B.size();i<A.size();i++){
if(A[i]<0){
ans.push_back(A[i]+10);
A[i+1]--;
}
else{
ans.push_back(A[i]);
}
}
while(ans.size()>1&&ans.back()==0){
ans.pop_back();
}
return ans;
}
int main() {
string a, b;
vector<int> A, B, res;
cin >> a >> b;
for (int i = a.size() - 1; i >= 0; --i){
A.push_back(a[i] - '0');
}
for (int i = b.size() - 1; i >= 0; --i){
B.push_back(b[i] - '0');
}
if (cmp(A, B)){
res = sub(A, B);
}
else {
cout << "-";
res = sub(B, A);
}
for (int i = res.size() - 1; i >= 0; --i){
cout << res[i];
}
return 0;
}
高精度乘法1:
import java.math.BigInteger;
import java.util.Scanner;
public class Demo {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
String b = scanner.next();
BigInteger s1 = new BigInteger(a);
BigInteger s2 = new BigInteger(b);
BigInteger s3 = s1.multiply(s2);
System.out.println(s3);
}
}
高精度乘法2:
#include<bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int> a,int b){
vector<int> s;
reverse(a.begin(),a.end());
int t=0; //t表示的是进位
for(int i=0;i<a.size();i++){
t=t+b*a[i];
s.push_back(t%10);
t=t/10;
}
//我们必须要把进位全部用完才算结束该函数。
while(t!=0){
s.push_back(t%10);
t=t/10;
}
return s;
}
vector<int> a;
vector<int> t;
int b;
int main(){
string s;
cin>>s>>b;
for(int i=0;i<s.size();i++){
a.push_back(s[i]-'0');
}
if(b==0){
cout<<0;
}
else{
t=mul(a,b);
for(int i=t.size()-1;i>=0;i--) cout<<t[i];
}
return 0;
}
高精度除法:
import java.util.*;
import java.math.*;
public class Main {
public static void main(String[] args){
String t1;
String t2;
Scanner scan = new Scanner(System.in);
t1 = scan.next();
t2 = scan.next();
BigInteger s1 = new BigInteger(t1);
BigInteger s2 = new BigInteger(t2);
System.out.println(s1.divide(s2));
System.out.println(s1.mod(s2));
}
}