高精度模板总结

本文详细介绍了高精度算术运算的实现方法,包括加法、减法、乘法和除法,提供了Java和C++两种语言的示例代码,并且利用标准模板库(STL)进行高效处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简要:

以下是我对高精度模板的总结,只有乘法和加法用了底层原理,底层原理是用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));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值