正整数的大数相乘

说明

1、输入必须是正整数

2、代码正确无误,因为这个是一道力扣的题。传送门

3、思路:从一个输入值中分别切出来每一位,与另个值相乘,并将结果相加。切出来的值与另一个值相乘的方法也是一位一位的切出来,相乘得到结果,然后汇总起来。

4、优化除了字符串形式的结果生成可以改成StringBuilder再快点,别的,目测不能再优化了。

代码

package calculate;

public class Multiply {

    public Multiply(){

        System.out.println( mutiply("88", "2") );
    }

    public String mutiply( String num1, String num2 ){

        //如果输入中存在0,直接返回结果
        if ( num1.equals("0") || num2.equals("0") )
            return "0";

        //分别初始化num1,num2的长度,以及结果可能的最长长度
        int len1 = num1.length();
        int len2 = num2.length();
        int len = len1 + len2;

        //初始化数组形式的结果以及字符串形式的结果
        int[] products = new int[len];
        String product = "";

        //拿num1第i个数分别乘num2
        for ( int i = 0; i < len1; i++ ){
            //获取num1的第i个数的整形值
//            int number1 = Integer.parseInt( num1.substring(len1-i-1, len1-i) );
            int number1 = num1.charAt(len1-i-1)-'0';
            
            //进行乘法计算
            for ( int j = 0; j < len2; j++ ){

                //获取num2的第j个数的整形形式
//                int number2 = Integer.parseInt( num2.substring(len2-j-1, len2-j) );
                int number2 = num2.charAt(len2-j-1)-'0';
                
                //进行数学运算
                int sum = number1*number2+products[j+i];
                products[j+i] = sum%10;

                //将进位的值存储在下一位
                products[j+i+1] += sum/10;

//                System.out.println( number1 + "\t " + number2 + "\t " + products[j+i] + "\t " + products[j+i+1]  );

            }

            //将已经计算过的较低位添加在字符串形式的结果集中
            product = products[i]+product;
        }

        //因为前len1位已经添加在结果集中了,直接从len1开始就可以了
        for ( int i = len1; i < len; i++ ){

            //若首位为零了
            if (products[i]==0 && i==len-1 ) continue;

            product = products[i]+product;
        }

        return product;

    }

    public static void main(String[] args) {
        Multiply multiply = new Multiply();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值