Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 面试问题-实现大整数乘法_Math - Fatal编程技术网

Math 面试问题-实现大整数乘法

Math 面试问题-实现大整数乘法,math,Math,实现大整数乘法 使用整数数组存储biginteger 与297897654一样,将存储为{2,9,7,8,9,7,6,5,4} 实现大整数的乘法函数 表达式:{2,9,8,8,9,8}*{3,6,3,4,5,8,9,1,2}={1,0,8,6,3,7,1,4,1,8,7,8,9,7,6} 我没能实现这个类,并且思考了几个星期,没有得到答案 有人能帮我用C#/Java实现它吗? 非常感谢。你知道如何在纸上做乘法吗 123 x 456 ----- 738 615 492 ----- 560

实现大整数乘法

  • 使用整数数组存储biginteger 与297897654一样,将存储为{2,9,7,8,9,7,6,5,4}
  • 实现大整数的乘法函数
    表达式:{2,9,8,8,9,8}*{3,6,3,4,5,8,9,1,2}={1,0,8,6,3,7,1,4,1,8,7,8,9,7,6}
  • 我没能实现这个类,并且思考了几个星期,没有得到答案

    有人能帮我用C#/Java实现它吗?
    非常感谢。

    你知道如何在纸上做乘法吗

      123
    x 456
    -----
      738
     615
    492
    -----
    56088
    

    我只想用代码实现该算法。

    如果你用长时间的方法来实现,那么你也必须实现Add()方法,以便在最后将所有部分相加。我从那里开始只是为了让球滚起来。完成Add()之后,Multipy()方法将按照相同的方式实现

    public static int[] Add(int[] a, int[] b) {
       var maxLen = (a.Length > b.Length ? a.Length : b.Length);
       var carryOver = 0;
       var result = new List<int>();
       for (int i = 0; i < maxLen; i++) {
          var idx1 = a.Length - i - 1;
          var idx2 = b.Length - i - 1;
          var val1 = (idx1 < 0 ? 0 : a[idx1]);
          var val2 = (idx2 < 0 ? 0 : b[idx2]);
    
          var addResult = (val1 + val2) + carryOver;
          var strAddResult = String.Format("{0:00}", addResult);
          carryOver = Convert.ToInt32(strAddResult.Substring(0, 1));
          var partialAddResult = Convert.ToInt32(strAddResult.Substring(1));
          result.Insert(0, partialAddResult);
       }
       if (carryOver > 0) result.Insert(0, carryOver);
       return result.ToArray();
    }
    
    公共静态int[]Add(int[]a,int[]b){
    var maxLen=(a.Length>b.Length?a.Length:b.Length);
    var结转=0;
    var result=新列表();
    对于(int i=0;i0)结果。插入(0,结转);
    返回result.ToArray();
    }
    
    C++实现:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int a[10] = {8,9,8,8,9,2};
        int b[10] = {2,1,9,8,5,4,3,6,3};
    
        // INPUT DISPLAY
        for(int i=9;i>=0;i--) cout << a[i];
        cout << " x ";
        for(int i=9;i>=0;i--) cout << b[i];
        cout << " = ";
    
        int c[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    
        for(int i=0;i<10;i++)
        {
                int carry = 0;
                for(int j=0;j<10;j++)
                {
                        int t = (a[j] * b[i]) + c[i+j] + carry;
                        carry = t/10;
                        c[i+j] = t%10;
                }
        }
    
        // RESULT DISPLAY
        for(int i=19;i>=0;i--) cout << c[i];
        cout << endl;
    }
    
    0000298898 x 0363458912 = 00000108637141878976
    
    源代码:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int a[10] = {8,9,8,8,9,2};
        int b[10] = {2,1,9,8,5,4,3,6,3};
    
        // INPUT DISPLAY
        for(int i=9;i>=0;i--) cout << a[i];
        cout << " x ";
        for(int i=9;i>=0;i--) cout << b[i];
        cout << " = ";
    
        int c[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    
        for(int i=0;i<10;i++)
        {
                int carry = 0;
                for(int j=0;j<10;j++)
                {
                        int t = (a[j] * b[i]) + c[i+j] + carry;
                        carry = t/10;
                        c[i+j] = t%10;
                }
        }
    
        // RESULT DISPLAY
        for(int i=19;i>=0;i--) cout << c[i];
        cout << endl;
    }
    
    0000298898 x 0363458912 = 00000108637141878976
    

    有一种极好的算法叫做Karatsuba算法。
    它使用分而治之的startegy..可以将大数相乘..
    我已经用java实现了我的it。。 使用一些操纵

     package aoa;
        import java.io.*;
        public class LargeMult {
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) throws IOException
        {
            // TODO code application logic here
            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    
            System.out.println("Enter 1st number");
            String a=br.readLine();
            System.out.println("Enter 2nd number");
            String b=br.readLine();
            System.out.println("Result:"+multiply(a,b));
    
        }
        static String multiply(String t1,String t2)
        {
    
            if(t1.length()>1&&t2.length()>1)
            {
                int mid1=t1.length()/2;
                int mid2=t2.length()/2;
                String a=t1.substring(0, mid1);//Al
                String b=t1.substring(mid1, t1.length());//Ar
                String c=t2.substring(0, mid2);//Bl
                String d=t2.substring(mid2, t2.length());//Br
                String s1=multiply(a, c);
                String s2=multiply(a, d);
                String s3=multiply(b, c);
                String s4=multiply(b, d);
    
    
                long ans;
                ans=Long.parseLong(s1)*(long)Math.pow(10, 
                b.length()+d.length())+Long.parseLong(s3)*(long)Math.pow(10,d.length())+
                Long.parseLong(s2)*(long)Math.pow(10, b.length())+Long.parseLong(s4);
                return ans+"";
            }
            else
    
            {
                return (Integer.parseInt(t1)*Integer.parseInt(t2))+"";
            }   
        }
    }    
    

    我希望这有帮助!!享受..

    提示:使用“分而治之”将int拆分为两半,这可以有效地将时间复杂度从O(n^2)降低到O(n^(log3))。要点是减少乘法运算。

    我正在发布我编写的java代码。希望这会有所帮助

    import org.junit.Test;
    import static org.junit.Assert.*;
    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    /**
    * Created by ${YogenRai} on 11/27/2015.
    *
    * method multiply BigInteger stored as digits in integer array and returns results
    */
    public class BigIntegerMultiply {
       public static List<Integer> multiply(int[] num1,int[] num2){
        BigInteger first=new BigInteger(toString(num1));
        BigInteger result=new BigInteger("0");
        for (int i = num2.length-1,k=1; i >=0; i--,k=k*10) {
            result =  (first.multiply(BigInteger.valueOf(num2[i]))).multiply(BigInteger.valueOf(k)).add(result);
        }
        return convertToArray(result);
    }
    
    private static List<Integer> convertToArray(BigInteger result) {
        List<Integer> rs=new ArrayList<>();
        while (result.intValue()!=0){
            int digit=result.mod(BigInteger.TEN).intValue();
            rs.add(digit);
            result = result.divide(BigInteger.TEN);
        }
        Collections.reverse(rs);
        return rs;
    }
    
    public static String toString(int[] array){
        StringBuilder sb=new StringBuilder();
        for (int element:array){
            sb.append(element);
        }
        return sb.toString();
    }
    
    @Test
    public void testArray(){
        int[] num1={2, 9, 8, 8, 9, 8};
        int[] num2 = {3,6,3,4,5,8,9,1,2};
        System.out.println(multiply(num1, num2));
    }
    
    import org.junit.Test;
    导入静态org.junit.Assert.*;
    导入java.math.biginger;
    导入java.util.ArrayList;
    导入java.util.Collections;
    导入java.util.List;
    /**
    *由${YogenRai}于2015年11月27日创建。
    *
    *方法将存储为整数数组中的数字的BigInteger相乘并返回结果
    */
    公共类BigIntegerMultiply{
    公共静态列表乘法(int[]num1,int[]num2){
    biginger first=新的biginger(toString(num1));
    BigInteger结果=新的BigInteger(“0”);
    对于(int i=num2.length-1,k=1;i>=0;i--,k=k*10){
    result=(第一个.multiply(biginger.valueOf(num2[i])).multiply(biginger.valueOf(k)).add(result);
    }
    返回convertToArray(结果);
    }
    私有静态列表convertToArray(BigInteger结果){
    List rs=new ArrayList();
    while(result.intValue()!=0){
    int digit=result.mod(biginger.TEN).intValue();
    rs.add(数字);
    结果=结果.除法(BigInteger.TEN);
    }
    收款。反向(卢比);
    返回rs;
    }
    公共静态字符串toString(int[]数组){
    StringBuilder sb=新的StringBuilder();
    for(int元素:数组){
    某人附加(元素);
    }
    使某人返回字符串();
    }
    @试验
    公共无效测试阵列(){
    int[]num1={2,9,8,8,9,8};
    int[]num2={3,6,3,4,5,8,9,1,2};
    系统输出println(乘法(num1,num2));
    }
    

    }

    给出整数类型数组中要相乘的数字,即int[]one和int[]two。

    public class VeryLongMultiplication {
    public static void main(String args[]){
        int[] one={9,9,9,9,9,9};
        String[] temp=new String[100];
        int c=0;
        String[] temp1=new String[100];
        int c1=0;
        int[] two={9,9,9,9,9,9};
        int car=0,mul=1; int rem=0; int sum=0;
        String str="";
    
        ////////////////////////////////////////////
        for(int i=one.length-1;i>=0;i--)
        {
            for(int j=two.length-1;j>=0;j--)
            {
                mul=one[i]*two[j]+car;
                rem=mul%10;
                car=mul/10;
                if(j>0)
                    str=rem+str;
                else
                    str=mul+str;
            }
            temp[c]=str;
            c++;
            str="";
            car=0;
        }
    
        ////////////////////////////////////////
        for(int jk=0;jk<c;jk++)
        {
            for(int l=c-jk;l>0;l--)
                str="0"+str;
            str=str+temp[jk];
            for(int l=0;l<=jk-1;l++)
                str=str+"0";
            System.out.println(str);
            temp1[c1]=str;
            c1++;
            str="";
        }
    
        ///////////////////////////////////
    
            String ag="";int carry=0;
            System.out.println("========================================================");
            for(int jw=temp1[0].length()-1;jw>=0;jw--)
            {
    
                for(int iw=0;iw<c1;iw++)
                { 
                    int x=temp1[iw].charAt(jw)-'0';
                    sum+=x;
    
                }
                sum+=carry;
                int n=sum;
    
                sum=n%10;carry=n/10;
                    ag=sum+ag;
                    sum=0;
                }
        System.out.println(ag);
    }
    }
    

    你需要一个从右边开始的递归函数,它可以直接将它相乘吗?实现它。你有什么问题?这需要数学标签。有更有效的算法,但是的,这肯定是我在面试中会做的。作为参考-@JamieWong,哪种算法最快?另外,存储二进制数字而不是十进制数字不是更好吗。没有考虑负数。看起来你会用数组中的每个数字来表示负数。所以-851应该是{-8,-5,-1}。这个假设很容易修改我上面的代码,以不同的方式处理结转,并将其转换为10的借钱。