题解 | #大数乘法#

大数乘法

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

采用模拟的方法,将乘数每一位乘出来的中间值进行存储,然后做加法,细节需要格外注意,包括下标的换算是这题的难点。

	public static String solve (String s, String t) {
        if(s==null||t==null||s.length()==0||t.length()==0||s.charAt(0)=='0'||t.charAt(0)==0)
            return "0";
        //将s*t每一位乘出来的中间值存入一个char数组中,数组长度为t.len+1
        int sLen = s.length();
        int tLen = t.length();
        //中间值的长度不会超过sLen+1,中间值的个数是tLen
        char[][] temps = new char[tLen][sLen+1];
        //tlen - 1对应0位置
        for(int i = tLen - 1;i>=0;i--){
            int in = 0;
            //i指定t的一位数字
            int curTNum = t.charAt(i) - '0';
            int temp;
            //sLen-1对应slen位置
            for(int j = sLen -1;j>=0;j--){
                temp = (curTNum * (s.charAt(j) - '0')) + in;
                temps[tLen-i-1][j+1] = (char)((temp % 10)+'0');
                in = temp/10;
            }
            temps[tLen-i-1][0] = (char)(in+'0');
        }
        //将中间结果加起来,temps[i]就需要乘以10^i
        char[] res = temps[0];
        int digit = 1;
        for(int i = 1;i<tLen;i++){
            //temps[i]*digit+res
            res = charArrAdd(res,temps[i],digit);
            digit++;
        }
        int start = 0;
        while(start<res.length-1&&res[start]=='0')
            start++;
        return String.valueOf(res,start,res.length-start);
    }
    //return b*digit+a
    public static char[] charArrAdd(char[] a,char[] b,int digit){
        //加法的答案不会超过长的那个+1
        int aLen = a.length;
        int bLen = b.length;
        int longLen = aLen>(bLen+digit)?aLen:bLen+digit;
        char[] res = new char[longLen+1];
        int aIdx = aLen-1;
        int bIdx = bLen-1;
        int w = longLen;
        int in = 0;
        int bitSum;
        while(aIdx>=0&&bIdx>=0){
            if(digit >0){//
                res[w--] = a[aIdx--];
                digit--;
            }else{
                bitSum = (a[aIdx--] - '0')+(b[bIdx--]-'0')+in;
                in = bitSum / 10;
                res[w--] = (char)((bitSum % 10)+'0');
            }
        }
        while(aIdx>=0){
            bitSum = (a[aIdx--] - '0') + in;
            in = bitSum / 10;
            res[w--] = (char)((bitSum % 10)+'0');
        }
        while(bIdx>=0){
            bitSum = (b[bIdx--]-'0')+in;
            in = bitSum / 10;
            res[w--] = (char)((bitSum % 10)+'0');
        }
        while(w>=0){
            res[w--] = (char)(in + '0');
            in = 0;
        }
        return res;
    }
waigo的刷题之路 文章被收录于专栏

收录平时刷题的题解

全部评论

相关推荐

点赞 评论 收藏
分享
07-02 13:50
闽江学院 Java
点赞 评论 收藏
分享
06-27 12:54
已编辑
门头沟学院 Java
累了,讲讲我的大学经历吧,目前在家待业。我是一个二本院校软件工程专业。最开始选专业是觉得计算机感兴趣,所以选择了他。本人学习计算机是从大二暑假结束开始的,也就是大三开始。当时每天学习,我个人认为Java以及是我生活的一部分了,就这样持续学习了一年半,来到了大四上学期末,大概是在12月中旬,我终于找的到了一家上海中厂的实习,但我发现实习生的工作很枯燥,公司分配的活也不多,大多时间也是自己在自学。就这样我秋招末才找到实习。时间来到了3月中旬,公司说我可以转正,但是转正工资只有7000,不过很稳定,不加班,双休,因为要回学校参加答辩了,同时当时也是心高气傲,认为可以找到更好的,所以放弃了转正机会,回学校准备论文。准备论文期间就也没有投递简历。然后时间来到了5月中旬,这时春招基本也结束了,然后我开始投递简历,期间只是约到了几家下场面试。工资也只有6-7k,到现在我不知道该怎么办了。已经没有当初学习的心劲了,好累呀,但是又不知道该干什么去。在家就是打游戏,boss简历投一投。每天日重一次。26秋招都说是针对26届的人,25怎么办。我好绝望。要不要参加考公、考研、央国企这些的。有没有大佬可以帮帮我。为什么感觉别人找工作都是顺其自然的事情,我感觉自己每一步都在艰难追赶。八股文背了又忘背了又忘,我每次都花很长时间去理解他,可是现在感觉八股、项目都忘完了。真的已经没有力气再去学习了。图片是我的简历,有没有大哥可以指正一下,或者说我应该走哪条路,有点不想在找工作了。
码客明:太累了就休息一下兄弟,人生不会完蛋的
如果实习可以转正,你会不...
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务