Java [编程题]大整数相乘

Java实现大整数相乘算法
这是一道编程题目,要求使用Java编程语言,不借助系统自带的大整数类型,来实现两个大整数的乘法运算。题目中提到需要编写一个函数处理单个字符的乘法,再结合大整数相加的函数,通过遍历每个字符来完成整个乘法过程。

[编程题]大整数相乘

  •  时间限制:1秒 空间限制:32768K

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

输入描述:

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

输出描述:

输入的乘积,用字符串表示

示例1

输入

72106547548473106236 982161082972751393

输出

70820244829634538040848656466105986748

分析:

       大整数相乘模拟我们平时算乘法的过程,先写个函数:被乘数是一个字符,然后在编写个大整数相加的函数。最后每次遍历被乘数就好。

import java.util.*;

/**
 * @program: 个人demo
 * @description: LeetCode练兵场
 * @author: Mr.Hu
 * @create: 2019-03-01 21:10
 */
public class Main{
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        while (sc.hasNext()){
            StringBuilder s1=new StringBuilder(sc.next());
            StringBuilder s2=new StringBuilder(sc.next());
            StringBuilder re=new StringBuilder();
            for (int i = s1.length()-1; i >=0; i--) {
                StringBuilder temp=multiply(s2,s1.charAt(i));
                for (int j = i; j < s1.length()-1; j++) temp.append('0');           //乘出来的结果别忘了升级(加0000)
                re=add(re,temp);
            }
            System.out.println(re);
        }
    }
    public static StringBuilder multiply(StringBuilder s, char c){
        StringBuilder re=new StringBuilder();
        int carry=0;
        for (int i = s.length()-1; i >=0 ; i--) {        //乘法
            int temp=(s.charAt(i)-'0')*(c-'0')+carry;
            re.append((char)(temp%10+'0'));
            carry=temp/10;
        }
        if (carry!=0) re.append((char)(carry+'0'));
        return re.reverse();
    }
    public static StringBuilder add(StringBuilder s1, StringBuilder s2){
        s1=s1.reverse();s2=s2.reverse(); //反转方便相加
        StringBuilder re=new StringBuilder();
        while (s1.length()<s2.length()) s1.append('0');         //补齐字符串方便相加++++ 加法的麻烦之处
        while (s1.length()>s2.length()) s2.append('0');
        int carray=0;
        for (int i =0 ; i <s1.length() ; i++) {
            int temp=s1.charAt(i)-'0'+s2.charAt(i)-'0'+carray;      //别忘了加上进位
            re.append((char) (temp%10+'0'));
            carray=temp/10;
        }
        if (carray!=0) re.append((char)(carray+'0'));
        return re.reverse();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值