Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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
Java 将两个十进制整数与除法运算相乘_Java_Divide And Conquer_Multiplication - Fatal编程技术网

Java 将两个十进制整数与除法运算相乘

Java 将两个十进制整数与除法运算相乘,java,divide-and-conquer,multiplication,Java,Divide And Conquer,Multiplication,我试着将两个数相乘,它们是正整数,它们的位数相同,通过递归的分治,我试着这样做:T(n)=4T(n/2)+O(n) 注意:我知道它以θ(n^2)运行,这很糟糕!这对我来说只是一种锻炼。 谢谢你,很抱歉我的英语不好。:) 我的问题是:我的错误在哪里? 代码如下: import java.util.Scanner; public class main { static int res=0; static int stage =0; public static void main(String[] a

我试着将两个数相乘,它们是正整数,它们的位数相同,通过递归的分治,我试着这样做:T(n)=4T(n/2)+O(n) 注意:我知道它以θ(n^2)运行,这很糟糕!这对我来说只是一种锻炼。 谢谢你,很抱歉我的英语不好。:) 我的问题是:我的错误在哪里? 代码如下:

import java.util.Scanner;
public class main {
static int res=0;
static int stage =0;
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    char[] Num1;
    char[] Num2;
    String num1 = in.nextLine();
    String num2 = in.nextLine();
    in.close();
    Num1 = num1.toCharArray();
    Num2 = num2.toCharArray();



    DaQMultiplay(Num1, Num2);
    System.out.println(res);
}
static int DaQMultiplay(char[] num1,char[] num2){
    if(num1.length<2){
        stage++;
        int num1sd =Integer.parseInt(new String(num1));
        int num2sd =Integer.parseInt(new String(num2));
        return (num1sd*num2sd);
    }
    stage++;
    double len = num1.length;
    int lenl = (int) Math.ceil(len/2);
    char []ln1 = new char[lenl];
    char []rn1 = new char[(int) (len-lenl)];
    char []ln2 = new char[lenl];
    char []rn2 = new char[(int) (len-lenl)];
    for (int i = 0; i < ln1.length; i++) {
        ln1[i]=num1[i];
    }
    for (int i = 0; i < rn1.length; i++) {
        rn1[i]=num1[i+lenl];
    }
    for (int i = 0; i < ln2.length; i++) {
        ln2[i]=num2[i];
    }
    for (int i = 0; i < rn2.length; i++) {
        rn2[i]=num2[i+lenl];
    }
    System.out.print("Left Side of num1:"+stage+" ");
    System.out.println(ln1);

    System.out.print("Right Side of num1:"+stage+" ");
    System.out.println(rn1);

    System.out.print("Left Side of num2:"+stage+" ");
    System.out.println(ln2);

    System.out.print("Right Side of num2:"+stage+" ");
    System.out.println(rn2);


    res+=DaQMultiplay(ln1,ln2)*(10^((int)len));
    System.out.println("res: "+res);
    res+=DaQMultiplay(ln1,rn2)*10^((int) (len-lenl));
    System.out.println("res: "+res);
    res+=DaQMultiplay(rn1,ln2)*10^((int) (len-lenl));
    System.out.println("res: "+res);
    res+=DaQMultiplay(rn1, rn2);
    System.out.println("res: "+res);
    return 0;
}
}

通常,您的代码不会处理num2解析为num1之前的一位数的情况。这将导致通过DaQ方法生成一个空字符串,最终引发异常。首先需要添加对num2解析处理的检查。此检查解决了第一个异常(第46行附近):


我不确定第二次检查是否适合您编写的算法,但总体思路是,这条if语句
if(num1.length这是完整的程序,一切正常:

import java.io.ObjectInputStream.GetField;
import java.util.Scanner;

public class main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] Num1;
        char[] Num2;
        String num1 = in.nextLine();
        String num2 = in.nextLine();
        in.close();
        Num1 = num1.toCharArray();
        Num2 = num2.toCharArray();  
        check(Num1, Num2);
    }
    static int DaQMultiplay(char[] num1,char[] num2){
        int res=0;
        if(num1.length<=1){
            int num1sd = 0;
            int num2sd = 0;
            if(num1!=null && !num1.equals("") && new String(num2).trim().length()>0){
                num1sd =Integer.parseInt(new String(num1));
            }

            if(num2!=null && !num2.equals("") && new String(num2).trim().length()>0){
                num2sd=Integer.parseInt(new String(num2));
            }
            return (num1sd*num2sd);
        }
        double len = num1.length;
        int lenl = (int) Math.ceil(len/2);
        char []ln1 = new char[lenl];
        char []rn1 = new char[(int) (len-lenl)];
        char []ln2 = new char[lenl];
        char []rn2 = new char[(int) (len-lenl)];
        for (int i = 0; i < ln1.length; i++) {
            ln1[i]=num1[i];
        }
        for (int i = 0; i < rn1.length; i++) {
            rn1[i]=num1[i+lenl];
        }
        for (int i = 0; i < ln2.length; i++) {
            ln2[i]=num2[i];
        }
        for (int i = 0; i < rn2.length; i++) {
            if(num2.length>i+lenl){
                rn2[i]=num2[i+lenl];
            }
        }

        res+=(DaQMultiplay(ln1,ln2)*(Math.pow(10, len)));
        res+=(DaQMultiplay(rn1,ln2)*(Math.pow(10, (len/2))));
        res+=(DaQMultiplay(ln1,rn2)*(Math.pow(10, (len/2))));
        res+=(DaQMultiplay(rn1, rn2));

        return res;
    }
    static void check(char []Num1,char []Num2){
        int res=0;
        if ((Num1.length%2)==0) {
            res=DaQMultiplay(Num1, Num2);
            System.out.println(res);
        }
        else{
            String num1 = String.valueOf(Num1);
            num1 = num1+"0";
            String num2 = String.valueOf(Num2);
            num2 = num2+"0";
            Num1=num1.toCharArray();
            Num2=num2.toCharArray();
            res=DaQMultiplay(Num1, Num2);
            res=(res/100);
            System.out.println(res);
        }
    }
}
import java.io.ObjectInputStream.GetField;
导入java.util.Scanner;
公共班机{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
char[]Num1;
char[]Num2;
字符串num1=in.nextLine();
字符串num2=in.nextLine();
in.close();
Num1=Num1.toCharArray();
Num2=Num2.toCharArray();
检查(Num1,Num2);
}
静态int-DaQMultiplay(char[]num1,char[]num2){
int res=0;
如果(num1.长度0){
num1sd=Integer.parseInt(新字符串(num1));
}
if(num2!=null&&!num2.equals(“”&&新字符串(num2.trim().length()>0){
num2sd=Integer.parseInt(新字符串(num2));
}
返回(num1sd*num2sd);
}
双透镜=num1.5长度;
int lenl=(int)Math.ceil(len/2);
char[]ln1=新字符[lenl];
char[]rn1=新字符[(int)(len lenl)];
char[]ln2=新字符[lenl];
char[]rn2=新字符[(int)(len lenl)];
对于(int i=0;ii+lenl){
rn2[i]=num2[i+lenl];
}
}
res+=(DaQMultiplay(ln1,ln2)*(Math.pow(10,len));
res+=(DaQMultiplay(rn1,ln2)*(Math.pow(10,(len/2)));
res+=(DaQMultiplay(ln1,rn2)*(Math.pow(10,(len/2)));
res+=(DaQMultiplay(rn1,rn2));
返回res;
}
静态无效检查(字符[]Num1,字符[]Num2){
int res=0;
如果((Num1.长度%2)==0){
res=DaQMultiplay(Num1,Num2);
系统输出打印项次(res);
}
否则{
String num1=String.valueOf(num1);
num1=num1+“0”;
String num2=String.valueOf(num2);
num2=num2+“0”;
Num1=Num1.toCharArray();
Num2=Num2.toCharArray();
res=DaQMultiplay(Num1,Num2);
res=(res/100);
系统输出打印项次(res);
}
}
}

谢谢,它解决了错误,但在征服步骤中算法的正确性仍然存在问题,我不知道如何处理4个传入的递归尾部,我的算法基于此文档:
 for (int i = 0; i < rn2.length; i++) {
    if(num2.length>i+lenl){
        rn2[i]=num2[i+lenl];
    }
  }
if(num1!=null && !num1.equals("") && new String(num2).trim().length()>0){
    num1sd =Integer.parseInt(new String(num1));
}

if(num2!=null && !num2.equals("") && new String(num2).trim().length()>0){
    num2sd=Integer.parseInt(new String(num2));
}
import java.util.Scanner;


public class main {
static int res=0;
static int pow;
static int stage =0;
public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    char[] Num1;
    char[] Num2;
    String num1 = in.nextLine();
    String num2 = in.nextLine();
    in.close();
    Num1 = num1.toCharArray();
    Num2 = num2.toCharArray();
    pow = Num1.length;



    DaQMultiplay(Num1, Num2);
    System.out.println(res);
}
static int DaQMultiplay(char[] num1,char[] num2){
    if(num1.length<2){
        stage++;
        int num1sd = 0;
        int num2sd = 0;
        if(num1!=null && !num1.equals("") && new String(num2).trim().length()>0){
            num1sd =Integer.parseInt(new String(num1));
        }

        if(num2!=null && !num2.equals("") && new String(num2).trim().length()>0){
            num2sd=Integer.parseInt(new String(num2));
        }
        return (num1sd*num2sd);
    }
    stage++;
    double len = num1.length;
    int lenl = (int) Math.ceil(len/2);
    char []ln1 = new char[lenl];
    char []rn1 = new char[(int) (len-lenl)];
    char []ln2 = new char[lenl];
    char []rn2 = new char[(int) (len-lenl)];
    for (int i = 0; i < ln1.length; i++) {
        ln1[i]=num1[i];
    }
    for (int i = 0; i < rn1.length; i++) {
        rn1[i]=num1[i+lenl];
    }
    for (int i = 0; i < ln2.length; i++) {
        ln2[i]=num2[i];
    }
    for (int i = 0; i < rn2.length; i++) {
        if(num2.length>i+lenl){
            rn2[i]=num2[i+lenl];
        }
    }
    System.out.print("Left Side of num1:"+stage+" ");
    System.out.println(ln1);

    System.out.print("Right Side of num1:"+stage+" ");
    System.out.println(rn1);

    System.out.print("Left Side of num2:"+stage+" ");
    System.out.println(ln2);

    System.out.print("Right Side of num2:"+stage+" ");
    System.out.println(rn2);

    res+=(DaQMultiplay(ln1,ln2)*(Math.pow(10, len)));
    System.out.println(res);
    res+=(DaQMultiplay(rn1,ln2)*(Math.pow(10, (len/2))));
    System.out.println(res);
    res+=(DaQMultiplay(ln1,rn2)*(Math.pow(10, (len/2))));
    System.out.println(res);
    res+=(DaQMultiplay(rn1, rn2));
    System.out.println(res);
    return 0;
}
}    
20011
91281
Left Side of num1:1 200
Right Side of num1:1 11
Left Side of num2:1 912
Right Side of num2:1 81
Left Side of num1:2 20
Right Side of num1:2 0
Left Side of num2:2 91
Right Side of num2:2 2
Left Side of num1:3 2
Right Side of num1:3 0
Left Side of num2:3 9
Right Side of num2:3 1
1800
1800
1820
1820
0
0
Left Side of num1:9 2
Right Side of num1:9 0
Left Side of num2:9 2
Right Side of num2:9
import java.io.ObjectInputStream.GetField;
import java.util.Scanner;

public class main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        char[] Num1;
        char[] Num2;
        String num1 = in.nextLine();
        String num2 = in.nextLine();
        in.close();
        Num1 = num1.toCharArray();
        Num2 = num2.toCharArray();  
        check(Num1, Num2);
    }
    static int DaQMultiplay(char[] num1,char[] num2){
        int res=0;
        if(num1.length<=1){
            int num1sd = 0;
            int num2sd = 0;
            if(num1!=null && !num1.equals("") && new String(num2).trim().length()>0){
                num1sd =Integer.parseInt(new String(num1));
            }

            if(num2!=null && !num2.equals("") && new String(num2).trim().length()>0){
                num2sd=Integer.parseInt(new String(num2));
            }
            return (num1sd*num2sd);
        }
        double len = num1.length;
        int lenl = (int) Math.ceil(len/2);
        char []ln1 = new char[lenl];
        char []rn1 = new char[(int) (len-lenl)];
        char []ln2 = new char[lenl];
        char []rn2 = new char[(int) (len-lenl)];
        for (int i = 0; i < ln1.length; i++) {
            ln1[i]=num1[i];
        }
        for (int i = 0; i < rn1.length; i++) {
            rn1[i]=num1[i+lenl];
        }
        for (int i = 0; i < ln2.length; i++) {
            ln2[i]=num2[i];
        }
        for (int i = 0; i < rn2.length; i++) {
            if(num2.length>i+lenl){
                rn2[i]=num2[i+lenl];
            }
        }

        res+=(DaQMultiplay(ln1,ln2)*(Math.pow(10, len)));
        res+=(DaQMultiplay(rn1,ln2)*(Math.pow(10, (len/2))));
        res+=(DaQMultiplay(ln1,rn2)*(Math.pow(10, (len/2))));
        res+=(DaQMultiplay(rn1, rn2));

        return res;
    }
    static void check(char []Num1,char []Num2){
        int res=0;
        if ((Num1.length%2)==0) {
            res=DaQMultiplay(Num1, Num2);
            System.out.println(res);
        }
        else{
            String num1 = String.valueOf(Num1);
            num1 = num1+"0";
            String num2 = String.valueOf(Num2);
            num2 = num2+"0";
            Num1=num1.toCharArray();
            Num2=num2.toCharArray();
            res=DaQMultiplay(Num1, Num2);
            res=(res/100);
            System.out.println(res);
        }
    }
}