死磕算法一、字符串相乘

题目

给出两个字符串表示正整数,求其乘积,但不得使用系统类将其转换成整数。

解法

先看代码

public static  String multiply(String num1, String num2) {
        String n1 = new StringBuilder(num1).reverse().toString();
        String n2 = new StringBuilder(num2).reverse().toString();

        int[] d = new int[num1.length()+num2.length()];7

        for(int i=0; i<n1.length(); i++){
            for(int j=0; j<n2.length(); j++){
                d[i+j] += (n1.charAt(i)-'0') * (n2.charAt(j)-'0');
            }
        }

        StringBuilder sb = new StringBuilder();


        for(int i=0; i<d.length; i++){
            int mod = d[i]%10;
            int carry = d[i]/10;
            if(i+1<d.length){
                d[i+1] += carry;
            }
            sb.insert(0, mod);
        }

        System.out.println(sb);
        while(sb.charAt(0) == '0' && sb.length()> 1){
            sb.deleteCharAt(0);
        }

        return sb.toString();
    }

解析

拿"45" * "67"举例,首先把整数字符串翻转,翻转成65* 76,由于最大乘积位数就是两位的长度,就是2+2=4,所以我们用一个数组d[4]保存乘积。

先举个普通的乘积例子,但是这个例子中计算时先不进行进位,到最后在进行进位,如下面的例子最后得出 24 58 35,然后在进行进位,就得出了3015。上面代码也是这个逻辑,只不过把他先翻转过来,最后通过求余、商进行进位。

    4  5
    6  7
---------------
    28 35
 24 30
 24 58 35

再看下面,由于代码下标是从0开始的,所以下面最后得出数组d=[35,58,24,0]

	 5   4
	 7   6
 --------------
   d[0]=35
   d[1]=30+28=58
   d[2]=24
   d[3]=0

然后在进行进位,最终计算如下:

d[0]=35保留5,进3

d[1]=58+3=61保留1,进6

d[2]=24+6=30保留0,进3

d[3]=3保留3。

然后由于字符串插入的时候都是插入到第0位,所以最后得出3015。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值