java 大数乘法

牛客题目链接

1. 题目考点

  1. StringBuilder 在字符串处理中的使用
  2. 字符串加法的升级,大数加法

2. 考点解析

  1. 一次就过,很激动
ArrayList<String> res = new ArrayList<>();
public String solve (String s, String t) {
    // write code here
    // 技巧:j 表示被乘数 0 的个数
    int j = 0;
    for (int i = s.length() - 1; i >= 0; i--) {
    	// 11 * 99 = (10 + 1) * 99, 拆分个位数乘法
        f1(t, s.charAt(i) - '0', j++);
    }
    String str = sum();
    return str;
}

public void f1(String a, int b, int num) {
    StringBuilder sb = new StringBuilder();
    int sum = 0, p = 0;
    for (int i = a.length() - 1; i >= 0; i--) {
        sum = (a.charAt(i) - '0') * b + p;
        sb.append(sum % 10);
        p = sum / 10;
    }
    if (p != 0) sb.append(p);
    // 先翻转再加 0
    sb.reverse();
    while (num-- != 0) sb.append(0);
    res.add(sb.toString());
}

public String sum() {
    String s = "";
    for (int  i = 0; i < res.size(); i++) 
        s = add(s, res.get(i));
    return s;
}
// 模板:字符串相加
public String add(String s1, String s2) {
    StringBuilder sb = new StringBuilder();
    int sum = 0, p = 0;
    int i = s1.length() - 1;
    int j = s2.length() - 1;
    // 注意:循环结束条件是 -1
    while (i != -1 && j != -1) {
        sum = (s1.charAt(i--) - '0') + (s2.charAt(j--) - '0') + p;
        sb.append(sum % 10);
        p = sum / 10;
    }
    while (i != -1) {
        sum = (s1.charAt(i--) - '0') + p;
        sb.append(sum % 10);
        p = sum / 10;
    }
    while (j != -1) {
        sum = (s2.charAt(j--) - '0') + p;
        sb.append(sum % 10);
        p = sum / 10;
    }
    if (p != 0) sb.append(p);
    return sb.reverse().toString();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值