题解 | #大数乘法#

大数乘法

http://www.nowcoder.com/practice/c4c488d4d40d4c4e9824c3650f7d5571

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param s string字符串 第一个整数
     * @param t string字符串 第二个整数
     * @return string字符串
     */
    public String solve (String s, String t) {
        // write code here

        // 但凡这两个数字有一个为 0,直接返回 0 即可
        if ((1 == s.length() && 0 == Integer.valueOf(s)) || (1 == t.length() && 0 == Integer.valueOf(t))) {
            return "0";
        }

        // 获取 s 和 t 字符串的长度
        int len1 = s.length();
        int len2 = t.length();

        // 定义一个 String,用于存放当前一次相乘的结果
        String curS = "";
        // 定义一个 String,用于存放上一次相乘的结果
        String preS = "";

        int num = 1;

        for (int i = len1 - 1; i > -1; i--) {
            // 此时,我们取出了被乘数中的一个数字,与乘数进行相乘,获取它们相乘的结果
            curS = multiplication(t, Integer.valueOf(s.charAt(i) + ""));
            if (i == len1 - 1) {
                preS = curS;
            } else {
                StringBuffer tmpCurS = new StringBuffer(curS);
                for (int j = 1; j <= num; j++) {
                    tmpCurS.append("0");
                }
                while (preS.length() != tmpCurS.length()) {
                    preS = "0" + preS;
                }
                preS = addition(new String(tmpCurS), preS);
                num++;
            }
        }

        // 返回最终的结果
        return preS;
    }
    
    // 计算一个字符串和单个字符的相乘的结果
    public String multiplication(String str1, int num2) {
        StringBuffer sb = new StringBuffer("");
        int carryBit = 0; // 进位
        int unit = 0; // 个位数
        int product = 0; // 乘积
        for (int i = str1.length() - 1; i > -1; i--) {
            // 计算当前两个字符相乘(别忘了加上进位)
            product = Integer.valueOf(str1.charAt(i) + "") * num2 + carryBit;
            // 获取进位
            carryBit = product / 10;
            // 获取个位上的数字
            unit = product % 10;
            // 将个位上的数字添加到 sb 中
            sb.append(unit);
        }
        // 别忘了,最终的进位也要添加到 sb 中
        if (carryBit != 0) {
            sb.append(carryBit);
        }
        // 返回最终结果前,反转 sb
        return new String(sb.reverse());
    }
    
    public String addition(String str1, String str2) {
        StringBuffer sb = new StringBuffer("");
        int carrayBit = 0; // 进位
        int unit = 0; // 个位数
        int total = 0; // 和
        for (int i = str1.length() - 1; i > -1; i--) {
            // 计算当前位置上的两个字符相加(别忘了加上进位)
            total = Integer.valueOf(str1.charAt(i) + "") + Integer.valueOf(str2.charAt(i) + "") + carrayBit;
            // 获取进位
            carrayBit = total / 10;
            // 获取个位数
            unit = total % 10;
            // 将个位上的数字添加到 sb 中
            sb.append(unit);
        }
        // 别忘了,最终的进位也要添加到 sb 中
        if (carrayBit != 0) {
            sb.append(carrayBit);
        }
        // 返回最终结果前,反转 sb
        return new String(sb.reverse());
    }
}
全部评论

相关推荐

10-15 16:27
门头沟学院 C++
LeoMoon:建议问一下是不是你给他付钱😅😅
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
440577次浏览 4493人参与
# 春招别灰心,我们一人来一句鼓励 #
41484次浏览 524人参与
# 阿里云管培生offer #
119864次浏览 2219人参与
# 地方国企笔面经互助 #
7928次浏览 18人参与
# 同bg的你秋招战况如何? #
75577次浏览 552人参与
# 虾皮求职进展汇总 #
114215次浏览 884人参与
# 北方华创开奖 #
107310次浏览 599人参与
# 实习,投递多份简历没人回复怎么办 #
2454001次浏览 34848人参与
# 实习必须要去大厂吗? #
55678次浏览 960人参与
# 提前批简历挂麻了怎么办 #
149825次浏览 1977人参与
# 投递实习岗位前的准备 #
1195707次浏览 18546人参与
# 你投递的公司有几家约面了? #
33180次浏览 188人参与
# 双非本科求职如何逆袭 #
661910次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4730次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157604次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11365次浏览 270人参与
# 发工资后,你做的第一件事是什么 #
12418次浏览 61人参与
# 工作中,努力重要还是选择重要? #
35612次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20091次浏览 240人参与
# 我的上岸简历长这样 #
451924次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39235次浏览 314人参与
# 非技术岗是怎么找实习的 #
155850次浏览 2120人参与
牛客网
牛客企业服务