模版:高精度加减乘除

2020-04-02  本文已影响0人  得力小泡泡

4个高精度的关键位置是t的表示,t均是上一位留下来的值,遵从大的在前,小的在后

1、高精度加法(高精度 + 高精度)

题目描述

算法分析

时间复杂度 O(n)

Java 代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static List<Integer> add(List<Integer> A,List<Integer> B )
    {
        if (A.size()<B.size()) return add(B,A);
        int t = 0;
        for (int i = 0; i < A.size(); i ++ )
        {
            t += A.get(i);
            if (i < B.size()) t += B.get(i);
            A.set(i, t % 10);
            t /= 10;
        }
        if (t!=0) A.add(t);
        return A;
    }
    public static void main(String[] args) {
        //传进两个字符串
        Scanner scan = new Scanner(System.in);
        String a = scan.next();
        String b = scan.next();
        
        List<Integer> A = new ArrayList<Integer>();
        List<Integer> B = new ArrayList<Integer>();
        for (int i = a.length() - 1; i >= 0; i -- ) A.add(a.charAt(i) - '0');
        for (int i = b.length() - 1; i >= 0; i -- ) B.add(b.charAt(i) - '0');

        List<Integer> C = add(A, B);
        for (int i = C.size() - 1; i >= 0; i -- ) System.out.print((C.get(i)));
    }
}

2、高精度减法(高精度 - 高精度)

算法分析

时间复杂度 O(n)

Java 代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    //判断A与B的大小关系 A >= B 返回true
    public static boolean cmp(List<Integer> A ,List<Integer> B)
    {
        if (A.size()!=B.size()) return A.size()>B.size();
        for(int i = A.size() - 1;i >= 0;i--)
            if (A.get(i) != B.get(i))
                return A.get(i) > B.get(i);
        //若A = B 返回true
        return true;
            
    }
    // C = A - B, 若A >= B 则求A - B,否则A < B 则求(B - A),最后再把'-'号添上
    public static List<Integer> sub(List<Integer> A,List<Integer> B)
    {
        if(!cmp(A,B)) return sub(B,A);
        int t = 0;
        for(int i = 0;i < A.size();i++)
        {
            t = A.get(i) - t;
            if(i < B.size()) t -= B.get(i);
            A.set(i, (t + 10) % 10);
            if(t < 0) t = 1;
            else t = 0;
        }
        //若该数的头为0,则去掉(注意:该数的数学顺序是倒序)
        while(A.size() > 1 && A.get(A.size() - 1) == 0) A.remove(A.size() - 1);
        return A;
    }
    public static void main(String[] args) {
        //传进两个字符串
        Scanner scan = new Scanner(System.in);
        String a = scan.next();
        String b = scan.next();
                
        List<Integer> A = new ArrayList<Integer>();
        List<Integer> B = new ArrayList<Integer>();
        for (int i = a.length() - 1; i >= 0; i -- ) A.add(a.charAt(i) - '0');
        for (int i = b.length() - 1; i >= 0; i -- ) B.add(b.charAt(i) - '0');
        //若该数为负数,添上负号
        if(!cmp(A,B)) System.out.print("-");
        List<Integer> C = sub(A, B);
        for (int i = C.size() - 1; i >= 0; i -- ) System.out.print((C.get(i)));
    }
    
}

3、高精度乘法(高精度 * 低精度)

算法分析

此处 A 是高精度的字符串, B 是整数

时间复杂度 O(n)

Java 代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static List<Integer> mul(List<Integer> A, int B)
    {
        int t = 0;
        for(int i = 0;i < A.size();i++)
        {
            t += A.get(i) * B;
            A.set(i, t % 10);
            t /= 10;
        }
        while(t != 0)
        {
            A.add(t % 10);
            t /= 10;
        }
        return A;
    }
    public static void main(String[] args) {
        //传进一个字符串,一个数字
        Scanner scan = new Scanner(System.in);
        String a = scan.next();
        int B = scan.nextInt();
                
        List<Integer> A = new ArrayList<Integer>();
        for (int i = a.length() - 1; i >= 0; i -- ) A.add(a.charAt(i) - '0');
        List<Integer> C = mul(A, B);

        for (int i = C.size() - 1; i >= 0; i -- ) System.out.print((C.get(i)));
    }
}

4、高精度除法(高精度 / 低精度),以及高精度取模

算法分析

时间复杂度 O(n)

Java 代码

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static int t = 0;
    //从高位往低位除
    public static List<Integer> div(List<Integer> A,int B)
    {
        for(int i = A.size() - 1;i >= 0 ;i--)
        {
            t = t * 10 + A.get(i);
            A.set(i, t / B);
            t %= B;
        }
        while(A.size() > 1 && A.get(A.size() - 1) == 0) A.remove(A.size() - 1);
        return A;
    }
    public static void main(String[] args) {
        //传进一个字符串,一个数字
        Scanner scan = new Scanner(System.in);
        String a = scan.next();
        int B = scan.nextInt();
                
        List<Integer> A = new ArrayList<Integer>();
        for (int i = a.length() - 1; i >= 0; i -- ) A.add(a.charAt(i) - '0');
        List<Integer> C = div(A, B);

        for (int i = C.size() - 1; i >= 0; i -- ) System.out.print((C.get(i)));
        System.out.println();
        System.out.println(t);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读