[编程题] 大整数相乘

来源:互联网 发布:校花级别的多漂亮知乎 编辑:程序博客网 时间:2024/06/05 17:06

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。
输入描述:
空格分隔的两个字符串,代表输入的两个大整数

输出描述:
输入的乘积,用字符串表示

输入例子1:
72106547548473106236 982161082972751393

输出例子1:
70820244829634538040848656466105986748

import java.util.*;public class Main{    public static void main(String[] args){        Scanner sc = new Scanner(System.in);        while(sc.hasNext()){            String s = sc.nextLine();            String[] s1 = s.split(" ");            System.out.println(multiply(s1[0],s1[1]));        }    }    private static String multiply(String s1,String s2){        String res = "";        if(s1.length() == 0 || s2.length() == 0) return "0";        int len = s2.length();        StringBuilder temp = new StringBuilder();        for(int i = len - 1;i >=0;i--){           temp =  multiplyCore(s1,s2.charAt(i));            for(int j =len-1-i;j>0;j--){                temp.append('0');            }            res = add(res,temp.toString());        }        return res;    }    private static StringBuilder multiplyCore(String s1,char c){        StringBuilder sb = new StringBuilder();        int jinwei = 0;        int v = 0;        for(int i = s1.length() - 1;i >= 0;i--){            v = (s1.charAt(i) - '0') * (c - '0')+ jinwei;            jinwei = v / 10;            v = v % 10;            sb.insert(0,v);        }         if(jinwei > 0){               sb.insert(0,jinwei);        }        return sb;    }    private static String add(String s1,String s2){        int i = s1.length() - 1;        int j = s2.length() - 1;        int jinwei = 0;        int v = 0;        StringBuilder sb = new StringBuilder();        for(;i >= 0 && j>=0;i--,j--){            v = jinwei + (s1.charAt(i) - '0') + (s2.charAt(j) - '0') ;            jinwei = v / 10;            v = v % 10;            sb.insert(0,v);        }        while(j >= 0){             v = jinwei + (s2.charAt(j) - '0') ;            jinwei = v / 10;            v = v % 10;            sb.insert(0,v);            j--;        }        while(i >= 0){             v = jinwei + (s1.charAt(i) - '0') ;            jinwei = v / 10;            v = v % 10;            sb.insert(0,v);            i--;        }        if(jinwei > 0){               sb.insert(0,jinwei);        }        return sb.toString();    }}