Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.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 欧拉计划第8期_Java_Project - Fatal编程技术网

Java 欧拉计划第8期

Java 欧拉计划第8期,java,project,Java,Project,我正在做关于Euler项目的第8题,有一些问题。上面说 线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1000 main.main(main.java:19) 当我尝试使用所需的13位数字运行它时,它会到达“0420752963450”,这是最后一个13位字符串,并因上述错误而崩溃 我知道错误的含义和来源,但我似乎无法修复它 所以,我的问题是如何使这项工作?我到底错在哪里?我花了好几个小时试图解决这个问题 public class ma

我正在做关于Euler项目的第8题,有一些问题。上面说

线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:1000 main.main(main.java:19)

当我尝试使用所需的13位数字运行它时,它会到达“0420752963450”,这是最后一个13位字符串,并因上述错误而崩溃

我知道错误的含义和来源,但我似乎无法修复它

所以,我的问题是如何使这项工作?我到底错在哪里?我花了好几个小时试图解决这个问题

public class main {

  public static void main(String[] args){
    String string = ("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450");
    char[] charAr = string.toCharArray();
    int x = 1;
    int i = 0;
    int y = 14;
    int product = 0;
    int tempx = 0;
    int temp = 0;
    int times = 1;
    int newLargest = 0;
    while (tempx <= 999){
        tempx = x;
        times = 1;
        while (x < (y - 1)){
            System.out.print(Integer.parseInt(String.valueOf(charAr[x - 1])));
            times = times * Integer.parseInt(String.valueOf(charAr[x - 1]));
            x++;
            i++;            
        }
        System.out.print("\n");
        System.out.println(
           "X: " + x + "\t Times: " + times + "\t tempx: " + tempx);
        x = tempx;
        x++;
        y++;

        if (i == 1000){
            i = 0;
        }
        temp = product;
        product = times;
        //System.out.println(times);
        if (product > temp){
            newLargest = product;
            //System.out.println(newLargest);
        }
        //System.out.println(newLargest);
    }
    //System.out.println(newLargest);
  }     
}
公共类主{
公共静态void main(字符串[]args){
字符串=("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450");
char[]charAr=string.toCharArray();
int x=1;
int i=0;
int y=14;
int乘积=0;
int-tempx=0;
内部温度=0;
整数倍=1;
int=0;
while(tempx temp){
新最大=产品;
//System.out.println(新最大);
}
//System.out.println(新最大);
}
//System.out.println(新最大);
}     
}

无需检查您的Euler 8解决方案的有效性:

从以下位置修改第二个while条件:

while (x < (y - 1))
while(x<(y-1))
致:

while(x<(y-1)和&x<字符长度+1)

为了在到达数组的最后一个单元格时中断。我认为您只需要在while循环中添加if条件:

while (x < (y - 1)){
    if(x-1 >= charAr.length) break; // add this line
    System.out.print(Integer.parseInt(String.valueOf(charAr[x - 1])));
    times = times * Integer.parseInt(String.valueOf(charAr[x - 1]));
    x++;
    i++;
}
while(x<(y-1)){
如果(x-1>=charAr.length)中断;//添加此行
System.out.print(Integer.parseInt(String.valueOf(charAr[x-1]));
times=times*Integer.parseInt(String.valueOf(charAr[x-1]);
x++;
i++;
}

我回顾了您的算法,老实说,防止错误非常容易,但我发现您的任务过于复杂,例如,当您可以使用“String.charAt()轻松访问数字时,为什么您必须将其转换为字符数组“方法。即使我解决了这个问题,你的程序也没有显示正确的结果。我已经研究了ProjectEuler问题8,并很快提供了这个解决方案。它是有效的,我希望它能帮助你了解你哪里出了问题,以及在未来哪里需要改进

private static void PE_Problem_8()
    {
        String NumbersArray = "73167176531330624919225119674426574742355349194934" +
                "96983520312774506326239578318016984801869478851843" +
                "85861560789112949495459501737958331952853208805511" +
                "12540698747158523863050715693290963295227443043557" +
                "66896648950445244523161731856403098711121722383113" +
                "62229893423380308135336276614282806444486645238749" +
                "30358907296290491560440772390713810515859307960866" +
                "70172427121883998797908792274921901699720888093776" +
                "65727333001053367881220235421809751254540594752243" +
                "52584907711670556013604839586446706324415722155397" +
                "53697817977846174064955149290862569321978468622482" +
                "83972241375657056057490261407972968652414535100474" +
                "82166370484403199890008895243450658541227588666881" +
                "16427171479924442928230863465674813919123162824586" +
                "17866458359124566529476545682848912883142607690042" +
                "24219022671055626321111109370544217506941658960408" +
                "07198403850962455444362981230987879927244284909188" +
                "84580156166097919133875499200524063689912560717606" +
                "05886116467109405077541002256983155200055935729725" +
                "71636269561882670428252483600823257530420752963450";

        long PermanentTotal = 0;
        try {
            for (int i = 0; i < NumbersArray.length(); i++) {
                Character firstNum = NumbersArray.charAt(i);
                long TemporaryTotal = Long.parseLong(firstNum.toString());
                for (int j = i + 1; j <= i + 12; j++) {
                    if(j < NumbersArray.length()) {
                        Character secondNum = NumbersArray.charAt(j);
                        if (secondNum.toString().length() > 0) {
                            TemporaryTotal *= Long.parseLong(secondNum.toString());
                        }
                    }
                }
                if (TemporaryTotal > PermanentTotal) {
                    PermanentTotal = TemporaryTotal;
                }
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("largest product: "+ PermanentTotal);
    }
private static void PE_Problem_8()
{
字符串编号array=“7316717653133062491922511974426574742355349194934”+
"96983520312774506326239578318016984801869478851843" +
"85861560789112949495459501737958331952853208805511" +
"12540698747158523863050715693290963295227443043557" +
"66896648950445244523161731856403098711121722383113" +
"62229893423380308135336276614282806444486645238749" +
"30358907296290491560440772390713810515859307960866" +
"70172427121883998797908792274921901699720888093776" +
"65727333001053367881220235421809751254540594752243" +
"52584907711670556013604839586446706324415722155397" +
"53697817977846174064955149290862569321978468622482" +
"83972241375657056057490261407972968652414535100474" +
"82166370484403199890008895243450658541227588666881" +
"16427171479924442928230863465674813919123162824586" +
"17866458359124566529476545682848912883142607690042" +
"24219022671055626321111109370544217506941658960408" +
"07198403850962455444362981230987879927244284909188" +
"84580156166097919133875499200524063689912560717606" +
"05886116467109405077541002256983155200055935729725" +
"71636269561882670428252483600823257530420752963450";
长期永久总计=0;
试一试{
对于(int i=0;i永久总计){
永久总计=临时总计;
}
}
}捕获(例外e){
e、 printStackTrace();
}
System.out.println(“最大产品:+PermanentTotal”);
}

您似乎在让代码变得复杂。让我们简单一点,看看会发生什么

首先,让我们用

tempx = x;
times = 1;
while (x < (y - 1)){
    System.out.print(Integer.parseInt(String.valueOf(charAr[x - 1])));
    times = times * Integer.parseInt(String.valueOf(charAr[x - 1]));
    x++;
    i++;            
}
System.out.print("\n");
System.out.println(
   "X: " + x + "\t Times: " + times + "\t tempx: " + tempx);
x = tempx;
tempx=x;
次数=1;
而(x<(y-1)){
System.out.print(Integer.parseInt(String.valueOf(charAr[x-1]));
times=times*Integer.parseInt(String.valueOf(charAr[x-1]);
x++;
i++;
}
系统输出打印(“\n”);
System.out.println(
“X:”+X+“\t次:”+Times+“\t tempx:”+tempx);
x=tempx;
所以它变成了

static int calculateValue(int x, int y, char[] charAr) {
    int times = 1;
    int newx = x;
    while( newx < (y -1) ) {
        int value = Integer.parseInt(String.valueOf(charAr[x-1])));
        times = times * value;
        newx++;
    }
    return times;
}

public static void main(String[] args){
    String string = ("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450");
    char[] charAr = string.toCharArray();
    int x = 1;
    int i = 0;
    int y = 14;
    int product = 0;
    int temp = 0;
    int times = 1;
    int newLargest = 0;
    while (tempx <= 999){
        times = calculateValue(x, y, charAr);
        if(times > newLargest) {
           newLargest = times;
        }
        x++;
        y++;
    }   
}
静态int计算值(int x
static int calculateValue(int x, int y, char[] charAr) {
    int times = 1;
    int newx = x;
    while( newx < (y -1) ) {
        int value = Integer.parseInt(String.valueOf(charAr[x-1])));
        times = times * value;
        newx++;
    }
    return times;
}

public static void main(String[] args){
    String string = ("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450");
    char[] charAr = string.toCharArray();
    int x = 1;
    int i = 0;
    int y = 14;
    int product = 0;
    int temp = 0;
    int times = 1;
    int newLargest = 0;
    while (tempx <= 999){
        times = calculateValue(x, y, charAr);
        if(times > newLargest) {
           newLargest = times;
        }
        x++;
        y++;
    }   
}
int calculateValue(int x, String theString) {
    int times = 1;
    int i = x; // traditionally, we use 'i' for loop variables.
    while( i < (x + FOURTEEN) ) {
        int value = Integer.parseInt(theString.charAt(i));
        times = times * value;
        i++;
    }
    return times;
}

public static void main(String[] args){
    String string = ("7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450");
    int x = 0;
    int newLargest = 0;
    while (x < string.length()){
        int times = calculateValue(x, string);
        if(times > newLargest) {
           newLargest = times;
        }
        x++;
    }
}
int calculateValue(int x, String theString) {
    int times = 1;
    int i = x; // traditionally, we use 'i' for loop variables.
    while( i < (x + FOURTEEN) && i < theString.length() ) {
        int value = Integer.parseInt(theString.charAt(i));
        times = times * value;
        i++;
    }
    return times;
}