首页 > 试题广场 >

大整数相乘

[编程题]大整数相乘
  • 热度指数:37663 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

输入描述:
空格分隔的两个字符串,代表输入的两个大整数


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

输入

72106547548473106236 982161082972751393

输出

70820244829634538040848656466105986748
import java.math.BigDecimal;
import java.util.*;
public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner cin=new Scanner (System.in);
        String s1=cin.next();
        String s2=cin.next();
        BigDecimal b1=new BigDecimal(s1);
        BigDecimal b2=new BigDecimal(s2);
        BigDecimal b3=b1.multiply(b2);
        String s3=String.valueOf(b3);
        System.out.print(s3);

    }

}



发表于 2020-01-10 12:32:45 回复(0)
import java.io.*;

public class Main {
    public static void main(String[] argc) throws IOException {
        InputStreamReader in = new InputStreamReader(System.in);
        BufferedReader reader = new BufferedReader(in);
        String[] string = reader.readLine().split(" ");
        System.out.println(stringProduct(string[0], string[1]));
    }

    public static String stringProduct(String multiplier, String multiplicand) {
        StringBuilder sBuilder = new StringBuilder();
        int a = multiplicand.length();
        int b = multiplier.length();
        int result[] = new int[a + b + 1];
        for (int i = a - 1; i >= 0; i--) {
            int multipierInt = multiplicand.charAt(i) - '0';
            int resultBit = b + i + 1;
            for (int j = b - 1; j >= 0; j--) {
                int multiplicandInt = multiplier.charAt(j) - '0';
                int tempResult = multipierInt * multiplicandInt;
                if (tempResult > 9) {
                    result[resultBit] += tempResult % 10;
                    result[resultBit - 1] += tempResult / 10;
                } else {
                    result[resultBit] += tempResult;
                }
                if (result[resultBit] > 9) {
                    result[resultBit - 1] += result[resultBit] / 10;
                    result[resultBit] = result[resultBit] % 10;
                }
                resultBit--;
            }
           
        }
        boolean start = false;
        for (int c : result) {
            if (!start && c == 0 ) {
                continue;
            }else{
                start = true;
            }
            if (start) {
                sBuilder.append(c);
            }
        }
        return sBuilder.toString();
    }
}

发表于 2019-10-17 23:58:44 回复(0)
/**
 * 字符串形式的大整数相乘
 *
 * @param str1 第一个操作数
 * @param str2 第二个操作数
 */
static void bigIntMulti(String str1, String str2) {
    // 数组用来保存每一位的值
    int[] res = new int[str1.length() + str2.length()];
    int k = res.length - 1;

    // 最后的结果,但是没有进位
    for (int j = str2.length() - 1; j >= 0; j--) {
        if (j != str2.length() - 1)
            k += str1.length() - 1;
        for (int i = str1.length() - 1; i >= 0; i--) {
            res[k--] += (str1.charAt(i) - '0') * (str2.charAt(j) - '0');
        }
    }

    // 从后往前处理进位,数组会有前导 0
    for (int i = res.length - 1; i > 0; i--) {
        res[i - 1] += res[i] / 10;
        res[i] = res[i] % 10;
    }

    String resStr = Arrays.toString(res);
    // 形如 [0,0,1,0,2,0,0] -> 0010200 -> 10200
    System.out.println(resStr.replaceAll("\\D", "").replaceAll("^(0+)", ""));
}

发表于 2019-08-27 20:50:50 回复(0)
public class BigInt {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        String s1=in.next();
        String s2=in.next();
        String rs=computeX(s1,s2);
        System.out.println(rs);
    }

    private static String computeX(String s1, String s2) {
        String []s=new String[s2.length()];
        for(int i=s2.length()-1;i>=0;i--){
            s[i]=compute(s1,s2.charAt(i));
        }
        return addAll(s);
    }

    private static String addAll(String[] s) {
        //计算所有字符串相加
        String rs="";
        for(int i=0;i<s.length;i++){
            for(int j=s.length-1;j>i;j--){
                s[i]=s[i]+"0";
            }
            //System.out.println(s[i]);
            rs=addString(rs,s[i]);
            //System.out.println(rs);
        }
        return rs;
    }

    private static String addString(String rs, String s) {
        String res="";
        int jinwei=0;
        if(rs.length()>s.length()){
            String tmp=rs;
            rs=s;
            s=tmp;
        }
        for(int i=rs.length()-1;i>=0;i--){
            int num=rs.charAt(i)-48+s.charAt(i-rs.length()+s.length())-48+jinwei;
            jinwei=num/10;
            res=num%10+res;
        }
        for(int i=s.length()-rs.length()-1;i>=0;i--){
            int num=s.charAt(i)-48+jinwei;
            jinwei=num/10;
            res=num%10+res;
        }
        if(jinwei!=0){
            res=jinwei+res;
        }
        return res;
    }

    private static String compute(String s1, char charAt) {
        //计算单个字符与字符串相乘
        int x=charAt-48;
        String rs="";
        int jinwei=0;
        for(int i=s1.length()-1;i>=0;i--){
            int num=x*(s1.charAt(i)-48)+jinwei;
            jinwei=num/10;
            rs=(num%10)+rs;
        }
        if(jinwei!=0){
            rs=jinwei+rs;
        }
        //System.out.println(rs);
        return rs;

    }
}
发表于 2019-06-13 21:53:25 回复(0)

不能用大整数,那就用BigDecimal吧。。。

import java.util.Scanner;
import java.math.BigDecimal;
public class Main{
    public static void main(String [] args){
        Scanner sc = new Scanner(System.in);
        String [] arr = sc.nextLine().split(" ");
        System.out.println(Cal(arr));
    }

    public static String Cal(String [] arr){
        StringBuilder sb0 = new StringBuilder(arr[0]);
        StringBuilder sb1 = new StringBuilder(arr[1]);
        sb0.insert(0,"0.");
        sb1.insert(0,"0.");
        BigDecimal bd = (new BigDecimal(new String(sb0))).multiply(new BigDecimal(new String(sb1)));
        sb0 = new StringBuilder(bd.toString());
        while(sb0.charAt(0)=='0'||sb0.charAt(0)=='.')
            sb0.deleteCharAt(0);
        return sb0.toString();
    }
}
编辑于 2019-06-04 18:06:27 回复(0)
import java.util.Scanner;
import java.math.BigDecimal;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String s1= scanner.next();
        String s2 = scanner.next();
        BigDecimal b1 = new BigDecimal(s1);
        BigDecimal b2 = new BigDecimal(s2);
        System.out.println(b1.multiply(b2));
    }
}



这不算使用系统自带的大整数吗?    也通过了!
发表于 2019-05-24 14:56:01 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str = br.readLine();
        System.out.println(twoNumsMul(str));
    }

    private static String twoNumsMul(String str) {
        String[] strArr = str.split(" ");
        String str1 = strArr[0].toString();
        String str2 = strArr[1].toString();
        int[] num1 = new int[str1.length()];
        int[] num2 = new int[str2.length()];
        int[] result = new int[num1.length + num2.length];
        // String转化为整型,一个位置放一个字符
        num1 = charToInt(str1);
        num2 = charToInt(str2);
        // 计算
        for (int i = 0; i < num1.length; i++) {
            for (int j = 0; j < num2.length; j++) {
                result[i+j] += num1[i] * num2[j];
                // 进位
                if (result[i+j] >= 10) {
                    result[i+j+1] += result[i+j] / 10;
                    result[i+j] %= 10;
                }
            }
        }
        //把结果数组转化为字符串返回
        StringBuffer sb = new StringBuffer();
        for( int i = result.length - 1; i >= 0; i--) {
            //最高为为0时
            if( (i == result.length - 1) && (result[result.length - 1] == 0) )
                continue;
            sb.append(result[i]);
        }
        return sb.toString();
    }
    
    private static int[] charToInt(String str) {
        int num[] = new int[str.length()];
        for (int i = str.length() - 1,j = 0; i >= 0 ; i--,j++) {
            num[j] = str.charAt(i) - '0';
        }
        return num ;
    }
}

发表于 2019-04-27 18:15:00 回复(0)
import java.io.*;
import java.util.*;

public class Main {
    public static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    public static List<Integer> list1=new ArrayList<Integer>();
    public static List<Integer> list2=new ArrayList<Integer>();
    public static void main(String[]args)throws Exception {
        String str=br.readLine();
        String []str1=str.trim().split(" ");
        if(str1.length>1) {
            String numberStr1[]=str1[0].trim().split("");
            String numberStr2[]=str1[1].trim().split("");
            //拆开放入集合中
            for(int i=numberStr1.length-1;i>=0;i--) {
                list1.add(Integer.parseInt(numberStr1[i]));
            }
            for(int i=numberStr2.length-1;i>=0;i--) {
                list2.add(Integer.parseInt(numberStr2[i]));
            }
        }
        LinkedList<Integer> list3=new LinkedList<Integer>();//记录乘积
        LinkedList<LinkedList<Integer>> list=new LinkedList<LinkedList<Integer>>();
        for(int i=0;i<list1.size();i++) {
            int num=0;//记录此位数
            int locatNum=0;//记录进位
            for(int j=0;j<list2.size();j++) {
                if(locatNum!=0) {
                    num=(list1.get(i)*list2.get(j)+locatNum)%10;
                    locatNum=(list1.get(i)*list2.get(j)+locatNum)/10;
                }else {
                    num=list1.get(i)*list2.get(j)%10;
                    locatNum=list1.get(i)*list2.get(j)/10;
                }
                list3.add(num);
                if(j==list2.size()-1&&locatNum!=0)list3.add(locatNum);//添加最高位
            }
            for(int j=0;j<i;j++) {
                list3.addFirst(0);
            }
            list.add(list3);
            list3=new LinkedList<Integer>();
        }
        LinkedList<Integer> listMul=new LinkedList<Integer>();//记录乘积
        int locatNum=0;//记录进位
        for(int i=0;i<list.get(list.size()-1).size();i++) {
            int number=0;//计算每位的和
            int num=0;//记录此位数
            for(int j=0;j<list.size();j++) {
                if(i<list.get(j).size()) {    
                    number+=list.get(j).get(i);
                    if(j==list.size()-1) {
                        number+=locatNum;
                    }
                }
            }
            num=number%10;locatNum=number/10;
            listMul.add(num);
            if(i==list.get(list.size()-1).size()-1&&locatNum!=0)listMul.add(locatNum);
        }
       // System.out.print("大整数的乘积为:");
        for(int i=listMul.size()-1;i>=0;i--) {
            System.out.print(listMul.get(i));
        }
    }
}

发表于 2019-04-12 15:16:23 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()) {
        String num1=in.nextBigDecimal().toString();
        String num2=in.nextBigDecimal().toString();
        String product = BigProduct(num1,num2);
        System.out.println(product);
        }
    }
    public static String BigProduct(String num1,String num2) {
        int[] result = new int[num1.length()+num2.length()];
        for(int i = num1.length()-1;i >= 0;i--){
            int x = num1.charAt(i) - '0';
            for(int j = num2.length()-1;j >= 0;j--){
                int y = num2.charAt(j) - '0';
                result[i+j+1] += x * y;
            }
        }
        for(int j = result.length - 1;j >= 0;j--) {
            if(result[j] > 10) {
                result[j-1] += result[j]/10;
                result[j] = result[j]%10;
            }
        }
        StringBuilder str = new StringBuilder();
        for(int i = 0;i < result.length; i++) {
            if(i==0 && result[i]==0) {
                continue;
            }
            str.append(result[i]);
        }
        return str.toString();
    }
}
发表于 2019-04-04 20:49:49 回复(0)
import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String a1=sc.next();
        String a2=sc.next();
        StringBuffer sb1=new StringBuffer();
        StringBuffer sb2=new StringBuffer();
        sb1.append(a1);
        sb2.append(a2);
        BigInteger bg1=new BigInteger(sb1.toString());
        BigInteger bg2=new BigInteger(sb2.toString());
        System.out.println(bg1.multiply(bg2));

}
}
发表于 2019-03-18 18:21:42 回复(0)
import java.util.*;
import java.math.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        BigInteger num1=sc.nextBigInteger();
        BigInteger num2=sc.nextBigInteger();
        System.out.println(num1.multiply(num2));
        sc.close();
    }
}
发表于 2019-03-12 17:13:17 回复(0)
1. import java.util.Arrays;
2. import java.util.Scanner;
3. public class Main {
4.     public static void main(String [] args) {
5.     String [] s;
6.     int al,bl,rl;
7.     Scanner sc= new Scanner(System.in);
8.     s=sc.nextLine().split(" ");
9.     al=s[0].length();
10.     bl=s[1].length();
11.     rl=al+bl+1;
12.     int [] a=new int [al];
13.     int [] b =new int [bl];
14.     int[] resulttmp =new int [rl];
15.     for(int i=0;i<al;i++)
16.         a[i]=s[0].charAt(i)-'0';
17.     for(int i=0;i<bl;i++)
18.         b[i]=s[1].charAt(i)-'0';
19.     for(int i=al-1;i>=0;i--) {
20.         for(int k=bl-1;k>=0;k--) {
21.             resulttmp[i+k+2]+=a[i]*b[k];
22.             resulttmp[i+k+1]+=resulttmp[i+k+2]/10;
23.             resulttmp[i+k+2]=Math.floorMod(resulttmp[i+k+2], 10);            
24.         }
25.     }    
26.     for(int i=0;i<rl;i++) {    
27.         if(resulttmp[i]!=0) {
28.             for(;i<rl;i++)
29.                 System.out.print(resulttmp[i]);
30.         }    
31.     }
32.     }
33. }
编辑于 2019-03-11 23:52:44 回复(0)
import java.math.BigDecimal;
import java.util.Scanner;

public class test2 {     public static void main(String[] args) {         Scanner read = new Scanner(System.in);         String s1;         s1 = read.next();         String s2;         s2 = read.next();         Mul(s1, s2);     }     private static void Mul(String s1, String s2) {                  int carry;         if (s1.length() < s2.length()) {             String tmp = s1;             s1 = s2;             s2 = tmp;         }         char[] c1 = s1.toCharArray();         char[] c2 = s2.toCharArray();         StringBuilder sb;         BigDecimal r;         BigDecimal result = new BigDecimal("0");         if (s1.equals("0") || s2.equals("0")) {             System.out.println(result);         } else {             for (int i = c2.length - 1; i >= 0; i--) {                 sb = new StringBuilder();                 if (c2[i] == '1' && c2.length == 1) {                     result = new BigDecimal(String.valueOf(c1));                 } else {                                          carry = 0;                     for (int j = c1.length - 1; j >= 0; j--) {                         int temp;                         int again = 0;                         temp = Integer.parseInt(String.valueOf(c1[j])) * Integer.parseInt(String.valueOf(c2[i]));                        if (carry + temp % 10 >= 10) {                             again++;                         }                         sb.append((temp % 10 + carry) % 10);                         carry = temp / 10 + again;                         if (j == 0 && carry != 0) {                             sb.append(carry);                         }                     }                     sb = sb.reverse();                     int k = i;                     while (k < c2.length - 1) {                         sb.append("0");                         k++;                     }                     r = new BigDecimal(sb.toString());                     result = result.add(r);                 }             }             System.out.println(result);         }     }
}
编辑于 2019-01-28 21:47:04 回复(1)
题目里面不是说了不让用系统自带的大整数类型嘛😒
老老实实字符串模拟了下

以前模拟过类似的,经常用负整数来设坑,以及可能会输出 000、-0这样的结果。
这道题好像没有挖这样的坑😤


import java.util.*;
public class Main {
    /*
        数字字符串 乘以 单个数字字符
     */
    static String mulOne(String stra, char ch){ return mulOne(stra,ch-'0'); }
    static String mulOne(String stra, int ch){
        StringBuilder ans= new StringBuilder(stra.length()+1);
        int carry= 0; //进位
        for(int i=stra.length()-1; i>=0; --i){
            int num= (stra.charAt(i)-'0')*(ch)+carry;
            ans.insert(0,num%10);
            carry= num/10;
        }
        if(carry>0) ans.insert(0,carry);
        return ans.toString();
    }
    /*
        数字字符串 乘以 数字字符串
     */
    static String mul(String stra, String strb){
        String ans="";
        for(int i=1; i<=strb.length(); i++){
            String str= mulOne(stra, strb.charAt(strb.length()-i));
            String zero="";
            for(int j=1; j<i; j++) zero+='0';
            ans= addition(ans,str+zero);
        }
        return ans;
    }
    /*
        数字字符串乘 加 数字字符
     */
    static String addition(String stra, String strb){
        int len= Math.max(stra.length(),strb.length());
        StringBuilder ans= new StringBuilder(len+1);
        int carry= 0;
        for(int i=1; i<=len; i++){
            int a= stra.length()-i<0 ? 0 : stra.charAt(stra.length()-i)-'0';
            int b= strb.length()-i<0 ? 0 : strb.charAt(strb.length()-i)-'0';
            int num = a+b+carry;
            ans.insert(0,num%10);
            carry= num/10;
        }
        if(carry>0) ans.insert(0,carry);
        return ans.toString();
    }
    public static void main(String[] args) {
        Scanner sca= new Scanner(System.in);
        while (sca.hasNext()){
            boolean negative= false;//判断是否未负数
            boolean zero= true;//判断是否为0
            String stra= sca.next();
            if('-'==stra.charAt(0)){
                negative= !negative;
                stra= stra.substring(1);
            }
            String strb= sca.next();
            if('-'==strb.charAt(0)){
                negative= !negative;
                strb= strb.substring(1);
            }
            String ans= mul(stra, strb);
            int indexNotZero= 0;//第一个非零数字字符的下标,用来去掉前置零
            for(int i=0; i<ans.length(); i++){
                if('0'!=ans.charAt(i)){
                    indexNotZero= i;
                    zero= false;
                    break;
                }
            }
            if(zero){
                System.out.println('0');//如果结果是零的话,可能输出 “0”、“-0”这样的结果
                continue;
            }
            if(negative && !zero) System.out.print('-');
            System.out.println(ans.substring(indexNotZero));
        }
    }
}
/*
72106547548473106236 982161082972751393
695423 456982
-695423 456982
-695423 -456982
695423 -456982
0 -11

70820244829634538040848656466105986748
317795793386
* */



发表于 2019-01-15 17:07:19 回复(0)
//大数运算无脑JAVA

import java.util.Scanner;
import java.math.BigInteger;
public class Main{
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        BigInteger a,b,c;
        a = sc.nextBigInteger();
        b = sc.nextBigInteger();
        c = a.multiply(b);
        sc.close();
        System.out.println(c);
    }
}

发表于 2019-01-09 23:02:11 回复(0)
import java.util.Arrays;
import java.util.Scanner;
/**
*办法比较傻
*/
public class Main {
    public static final char[] add(char[] longStr, char[] shortStr) {
        int lLength = longStr.length, sLength = shortStr.length;
        if (lLength < sLength) return null;
        int lp = lLength - 1, sp = sLength - 1;
        char[] resultStr = new char[lLength + 1];
        int currentResult = 0, carry = 0;
        resultStr[0] = '0';
        while (lp >= 0) {
            if (sp >= 0) {
                currentResult = longStr[lp] - '0' + shortStr[sp] - '0' + carry;
                --sp;
            } else {
                currentResult = longStr[lp] - '0' + carry;
            }
            resultStr[lp + 1] = (char) ('0' + currentResult % 10);
            carry = currentResult / 10;
            --lp;
        }
        if (carry > 0) {
            resultStr[0] = (char) ('0' + carry);
        } else {
            resultStr = Arrays.copyOfRange(resultStr, 1, lLength + 1);
        }
        return resultStr;
    }

    public static final char[] mul(char[] longStr, char ch) {
        int carry = 0, currentResult = 0, strLength = longStr.length;
        char[] results = new char[strLength + 1];
        for (int i = strLength - 1; i >= 0; i--) {
            currentResult = (longStr[i] - '0') * (ch - '0') + carry;
            carry = currentResult / 10;
            results[i + 1] = (char) ('0' + currentResult % 10);
        }
        if (carry > 0) {
            results[0] = (char) ('0' + carry);
        } else{
            results = Arrays.copyOfRange(results, 1, strLength + 1);
        }
        return results;
    }

    public static final char[] mulChars(char[] strA, char[] strB) {
        int bLength = strB.length;
        int resultLength = strA.length + strB.length;
        char[] results = new char[resultLength];
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < resultLength; i ++) results[i] = '0';
        for (int i = 0; i < bLength; i++) {
            stringBuffer.delete(0, stringBuffer.length());
            char[] a = add(results, mul(strA, strB[i]));
            stringBuffer.append(add(results, mul(strA, strB[i])));
            if (i != bLength - 1) stringBuffer.append('0');
            results = stringBuffer.toString().toCharArray();
        }
        int firstNo0 = 0;
        for (int i = 0; i < results.length ; i ++){
            if (results[i] != '0'){
                firstNo0 = i;
                break;
            }
        }
        return Arrays.copyOfRange(results, firstNo0, results.length);
    }

    public static void main(String[] args) {
        String firstString = null;
        String secondString = null;
        Scanner scanner = new Scanner(System.in);
        firstString = scanner.next();
        secondString = scanner.next();
        System.out.println(String.valueOf(mulChars(firstString.toCharArray(), secondString.toCharArray())));
    }
}

发表于 2018-09-14 18:18:16 回复(0)
import java.util.Scanner;

public class Main { 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String num1 = in.next(), num2 = in.next();
        System.out.println(multiply(num1,num2));
    }
    public static String multiply(String num1, String num2) {
        num1 = new StringBuilder(num1).reverse().toString();
        num2 = new StringBuilder(num2).reverse().toString();
        //a的长度是(num1.length - 1) + (num2.length - 1) + 1
        int[] a = new int[num1.length() + num2.length() - 1];
        for (int i = 0; i < num1.length(); i++) {
            int n1 = num1.charAt(i) - '0';
            for (int j = 0; j < num2.length(); j++) {
                int n2 = num2.charAt(j) - '0';
                a[i + j] += n1 * n2;
            }
        }

        StringBuilder sb = new StringBuilder();
        int carry = 0;
        for (int i = 0; i < a.length || carry != 0; i++) {
            if(i < a.length)    carry += a[i];
            sb.append(carry % 10);
            carry /= 10;
        }
        return sb.length() == 0 ? "0" : sb.reverse().toString();
    }
}
编辑于 2017-08-06 21:52:47 回复(0)