题解 | #大数乘法#

大数乘法

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());
    }
}
全部评论

相关推荐

邮小鼠:粤嵌的项目水的要死 来我们学校带过课程实习 项目名字是车机终端 实际上就是写了了个gui 还是老师把代码发给你你改改的那种
点赞 评论 收藏
分享
10-07 23:57
已编辑
电子科技大学 Java
八街九陌:博士?客户端?开发?啊?
点赞 评论 收藏
分享
评论
点赞
收藏
分享
正在热议
# 25届秋招总结 #
442727次浏览 4513人参与
# 春招别灰心,我们一人来一句鼓励 #
42019次浏览 533人参与
# 阿里云管培生offer #
120311次浏览 2220人参与
# 地方国企笔面经互助 #
7965次浏览 18人参与
# 同bg的你秋招战况如何? #
76850次浏览 564人参与
# 实习必须要去大厂吗? #
55781次浏览 961人参与
# 北方华创开奖 #
107445次浏览 600人参与
# 虾皮求职进展汇总 #
115819次浏览 886人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11607次浏览 288人参与
# 实习,投递多份简历没人回复怎么办 #
2454766次浏览 34858人参与
# 提前批简历挂麻了怎么办 #
149907次浏览 1977人参与
# 在找工作求抱抱 #
906050次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4759次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1195967次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157638次浏览 2267人参与
# 双非本科求职如何逆袭 #
662289次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12764次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35833次浏览 384人参与
# 简历中的项目经历要怎么写? #
86924次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20137次浏览 240人参与
# 我的上岸简历长这样 #
452024次浏览 8088人参与
牛客网
牛客企业服务