大数运算

大数运算

大数运算的概念

大数运算指最特别大的数进行运算,一般超过计算机能表示的最大数字。核心思想是将这些数字放在一个集合或者数组中,在根据基本的加减乘除的计算规则对大数一位一位的进行计算。这里共整理的四个类型,均为ACwing上的算法基础课中的模板题
Java自带大数类,所以这部分可以不是特别重要,但是也可以掌握一下。
四种类型类:

  • 大数+大数
  • 大数-大数(答案可以为负数)
  • 大数*小数
  • 大数/小数

大数运算模板

以下为四个模板

import java.util.*;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.*;
public class Main{
    //加法运算
    public static List<Integer> add(List<Integer> a, List<Integer> b){
        int t = 0;//进位标志位
        List<Integer> c = new ArrayList<>();
        for(int i = 0; i < a.size() || i < b.size(); i++){
            if(i >= a.size()){
                t = t + b.get(i);
            }else
            if(i >= b.size()){
                t = t + a.get(i);
            }else{
                t = t + a.get(i)+b.get(i);
            }
            c.add(t % 10);//计算该位的最终答案
            t /= 10;//计算是否有进位

        }
        if(t>0) c.add(1);
        return c;
    }
    public static void main(String[] args)throws IOException{
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String line1 = buffer.readLine();
        String line2 = buffer.readLine();
        List<Integer> num1 = new ArrayList<>();
        List<Integer> num2 = new ArrayList<>();
        for(int i=line1.length()-1; i>=0; i--){
            num1.add((int)(line1.charAt(i)-'0'));
        }
        for(int i=line2.length()-1; i>=0; i--){
            num2.add((int)(line2.charAt(i)-'0'));
        }
        List<Integer> ans = add(num1,num2);
        Collections.reverse(ans);
        for(int m : ans) System.out.print(m);
    }
}
//减法模板
import java.util.*;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main{
    public static boolean cmp(List<Integer> a, List<Integer> b){
        if(a.size() > b.size()) return true;
        if(a.size() < b.size()) return false;
        for(int i = a.size()-1; i >= 0; i--){
            if(a.get(i)>b.get(i)){
                return true;
            }
            if(a.get(i) < b.get(i)){
                return false;
            }
        }
        return true;
    }
    public static List<Integer> minus(List<Integer> a, List<Integer> b){
        int t = 0;
        List<Integer> c = new ArrayList<>();
        for(int i = 0; i < a.size() || i < b.size(); i++){
            int m1 = 0,m2=0;
            if( i >= b.size()){
                m1 = a.get(i);
                m2 = 0;
            }
            else{
                m1 = a.get(i);
                m2 = b.get(i);
            }
            t = t+m1-m2;//若t为-,则需要借位
            if(t < 0){
                c.add(t+10);
                t = -1;
            }else{
                c.add(t);
                t = 0;
            }
        }
        return c;
    }
    public static void main(String[] args)throws IOException{
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String line1 = buffer.readLine();
        String line2 = buffer.readLine();
        List<Integer> num1 = new ArrayList<>();
        List<Integer> num2 = new ArrayList<>();
        for(int i=line1.length()-1; i>=0; i--){
            num1.add((int)(line1.charAt(i)-'0'));
        }
        for(int i=line2.length()-1; i>=0; i--){
            num2.add((int)(line2.charAt(i)-'0'));

        }
        List<Integer> ans = new ArrayList<>();
        if(cmp(num1,num2))  ans = minus(num1,num2);
        else{
            ans = minus(num2,num1);
            System.out.print("-");
        }//判断两数的大小
        Collections.reverse(ans);
        boolean flag = true;
        for(int i = 0; i < ans.size(); i++){

            if(ans.get(i) == 0 && i != ans.size()-1 && flag){
                continue;
            }
            flag = false;
            System.out.print(ans.get(i));
        }
    }
}
import java.util.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
public class Main{
    //用小数去乘每大数的每一位。
    public static List<Integer> mul(List<Integer> a, int b){
        int t = 0;//t表示进位
        int n = a.size();
        List<Integer> ans = new ArrayList<>();
        for(int i = 0; i < n; i++){
            t += b * a.get(i);
            ans.add(t%10);
            t /= 10;
        }
        if(t != 0) ans.add(t);
        return ans;
    }
    public static void main(String[] args)throws IOException{
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String bigNumStr = buffer.readLine();
        int n = bigNumStr.length();
        int normalNum = Integer.valueOf(buffer.readLine());
        List<Integer> bigNum = new ArrayList<Integer>();
        for(int i = n-1; i >= 0; i--){
            bigNum.add((int)(bigNumStr.charAt(i)-'0'));
        }
        List<Integer> ans = mul(bigNum,normalNum);
        for(int i = ans.size()-1; i >= 0; i--){
            System.out.print(ans.get(i));
        }
    }
}
import java.util.*;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
class Ans{
    public List<Integer> result = new ArrayList<>();
    public int mod = 0;
}
public class Main{
    public static Ans div(List<Integer> a, int b){
        Ans ans = new Ans();
        int t = 0;//t表示余数
        for(int i = a.size()-1; i >= 0; i--){
            t = t*10 + a.get(i);
            ans.result.add(t/b);
            t = t % b;
        }
        ans.mod = t;
        while(ans.result.size()>1 && ans.result.get(0) == 0) ans.result.remove(0);
        return ans;
    }
    public static void main(String[] args)throws IOException{
        BufferedReader buffer = new BufferedReader(new InputStreamReader(System.in));
        String bigNumStr = buffer.readLine();
        int n = bigNumStr.length();
        int normalNum = Integer.valueOf(buffer.readLine());
        List<Integer> bigNum = new ArrayList<Integer>();
        for(int i = n-1; i >= 0; i--){
            bigNum.add((int)(bigNumStr.charAt(i)-'0'));
        }
        Ans ans = div(bigNum,normalNum);
        Collections.reverse(ans.result);
        for(int i = ans.result.size()-1; i >= 0; i--){
            System.out.print(ans.result.get(i));
        }
        System.out.print("\n" + ans.mod);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值