zoukankan      html  css  js  c++  java
  • 43.Multiply Strings

        /*
         * 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();
        }
  • 相关阅读:
    ORACLE 删除重复的数据
    Linux查看某个文件 单个字符的 个数
    通过虚拟机增加Linux的磁盘(分区容量)
    redheat7 sd 0:0:0:0: [sda] Assuming drive cache: write through(未解决)
    安装数据库Typical path for xclock: /usr/X11R6/bin/xclock 错误问题
    解决Visual Studio 2015启动慢的问题
    使用Discuz!自带参数防御CC攻击以及原理
    mysql 去除特殊字符和前后空白字符
    最新版的Chrome 69.0 设置始终开启flash而不是先询问
    DNS_PROBE_FINISHED_NXDOMAIN 问题解决
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5461353.html
Copyright © 2011-2022 走看看