码迷,mamicode.com
首页 > 其他好文 > 详细

43.Multiply Strings

时间:2016-05-05 12:59:43      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

    /*
     * 43.Multiply Strings 
     * 2016-5-4 by Mingyang 很像一个乘除法的计算器
     * 我的这种做法确实无可厚非,但是如果对于特殊的客户,比如说无限大的数乘以无限大的数
     * 那么我就不能老老实实的乘了,会溢出。就可以把每一位存在一个数组里面
     * 利用前面做加减法的算法,A[0]*B[0]=C[0]每一位对应的写在C的对应位上,然后不断地累积
     */
    //我的最最原始的解法
    public static String multiply(String num1, String num2) {
        if (num1.length() == 0 || num1 == null || num2.length() == 0|| num2 == null)
            return "";
        int len1 = num1.length();
        int len2 = num2.length();
        num1 = new StringBuffer(num1).reverse().toString();
        num2 = new StringBuffer(num2).reverse().toString();
        double res = 0;
        String result = "";
        for (int i = 0; i < len1; i++) {
            int temp = 0;
            int next = 0;
            StringBuffer sb = new StringBuffer();
            for (int j = 0; j < len2; j++) {
                int n1 = num1.charAt(i) - ‘0‘;
                int n2 = num2.charAt(j) - ‘0‘;
                temp = next + n1 * n2;
                next = temp / 10;
                sb.append(temp % 10);
            }
            res = res + Integer.parseInt(sb.reverse().toString())* Math.pow(10.0, (double) i);
        }
        if (res > Integer.MAX_VALUE)
            return "";
        result = Double.toString(res);
        return result;
    }
    //思路和2一样了,自己的实现
    public static String multiply1(String num1, String num2) {
           int len1=num1.length();
           int len2=num2.length();
           if(num1==null||len1==0||num2==null||len2==0||num1.equals("0")||num2.equals("0"))
              return "0";
           char[] array1=num1.toCharArray();
           char[] array2=num2.toCharArray();
           int[] res=new int[len1+len2];
           for(int i=len1-1;i>=0;i--){
               for(int j=len2-1;j>=0;j--){
                   int s=len1-1-i+len2-1-j;
                   res[s]=res[s]+(array1[i]-‘0‘)*(array2[j]-‘0‘);
                   if(res[s]>9){
                       res[s+1]+=res[s]/10;
                       res[s]=res[s]%10;
                   }
                   
               }
           }
           StringBuffer sb=new StringBuffer();
           for(int i=0;i<res.length-1;i++){
               sb.append(res[i]);
           }
           //这里不要忘了,因为不好估计C的位数,多出的一位是0的时候需要去掉不加
           if(res[res.length-1]!=0)
               sb.append(res[res.length-1]);
           sb.reverse();
           return sb.toString();           
        }
    //网上的解法,比如你的i位我的j位,我们乘在一起以后就是i+j位的数组里面,这样就比较好一点
    //比我好的地方就是把string reverse了一下,便于计算
    public static String multiply2(String num1, String num2) {
        num1 = new StringBuilder(num1).reverse().toString();
        num2 = new StringBuilder(num2).reverse().toString();
        // even 99 * 99 is < 10000, so maximaly 4 digits
        int[] d = new int[num1.length() + num2.length()];
        for (int i = 0; i < num1.length(); i++) {
            int a = num1.charAt(i) - ‘0‘;
            for (int j = 0; j < num2.length(); j++) {
                int b = num2.charAt(j) - ‘0‘;
                d[i + j] += a * b;
            }
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < d.length; i++) {
            int digit = d[i] % 10;
            int carry = d[i] / 10;
            sb.insert(0, digit);
            // 这一步很关键,因为会出边界,就是最后进的那一位
            if (i < d.length - 1)
                d[i + 1] += carry;
        }
        // trim starting zeros
        while (sb.length() > 0 && sb.charAt(0) == ‘0‘) {
            sb.deleteCharAt(0);
        }
        return sb.length() == 0 ? "0" : sb.toString();
    }

 

43.Multiply Strings

标签:

原文地址:http://www.cnblogs.com/zmyvszk/p/5461353.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!