我正在就项目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);
}
}
答案 0 :(得分:1)
不检查解决方案对Euler#8的有效性:
修改第二个条件来自:
while (x < (y - 1))
到:
while (x < (y - 1) && x < charAr.length+1)
以便在到达阵列的最后一个单元格时中断。
答案 1 :(得分:0)
我认为你只需要在while循环中添加if-condition:
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++;
}
答案 2 :(得分:0)
我已经检查了你的算法,老实说,防止错误很容易,但我发现你过度复杂的任务,例如,当你可以轻松访问时为什么必须将它转换为char数组使用&#34; String.charAt()&#34;的数字方法。即使我修复了问题,你的程序也没有显示正确的结果。我查看了项目Euler问题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);
}
答案 3 :(得分:0)
您似乎正在使代码变得复杂。让我们简单一点,看看会发生什么。
首先,让我们用
创建一个函数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;
所以它变成
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++;
}
}
那好多了。现在,做一名数学家并从0开始计数。然后让我们为#14;&#39;做一个常数,这样我们就可以消除y。而且,既然我们正在寻找那些超出界限的东西,那么我们就确保我们不会超出我们的字符串长度。它可能是999,但为什么不安全并使用string.length()来使用实际值。并直接使用字符串而不是那个奇怪的数组。
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++;
}
}
现在,我们仍然无法解决这个问题,但至少我们可以对此进行一些推理。它正在发生,因为它已经超出界限。 x的最大尺寸为999.&#39; i&#39;是x + FOURTEEN,或1013。 那比我们的阵列长。因此,我们需要将其分解以确保不会发生。 为此,我们修改calculateValue,使其在到达字符串末尾时停止。
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;
}