Ich habe versucht, Probleme von Project Euler zu lösen. Ich weiß, dass meine Methode logisch funktionieren würde (sie gibt fast sofort Antworten auf das kleine Problem zurück). Es skaliert jedoch schrecklich. Ich habe bereits versucht, die INI-Datei zu ändern, aber ohne Erfolg.Overheading Heap Overflow Probleme
Hier ist mein Code:
public class Number28 {
static int SIZE = 101; //this should be an odd number, i accidentally posted 100
/**
* @param args
*/
public static void main(String[] args) {
double start = System.currentTimeMillis();
long spiral[][]= spiral(SIZE);
long sum = 0;
for(int i = 0; i < SIZE; i++)
{
sum += spiral[i][i];
sum += spiral[i][SIZE - 1 - i];
}
System.out.println(sum - 1);
double time = System.currentTimeMillis() - start;
System.out.println(time);
}
public static long[][] spiral(int size){
long spiral[][]= new long[size][size];
if(size == 1){
spiral[0][0] = 1;
return spiral;
}
else{
long subspiral[][]= new long[size - 2][size - 2];
subspiral = spiral(size - 2);
for(int r = 0; r < size - 2; r++){
for(int c = 0; c < size - 2; c++){
spiral[r + 1][c + 1] = subspiral[r][c];
}
}
long counter = subspiral[0][size - 3];
for(int r = 1; r < size ; r++){
counter++;
spiral[r][size - 1] = counter;
}
for(int c = size - 2; c >= 0; c--){
counter++;
spiral[size - 1][c] = counter;
}
for(int r = size - 2 ; r >= 0 ; r--){
counter++;
spiral[r][0] = counter;
}
for(int c = 1; c < size ; c++){
counter++;
spiral[0][c] = counter;
}
return spiral;
}
}
}
Hier ist der bearbeitete Code, wie ein Edelstein gearbeitet:
public class Number28 {
static int SIZE = 1001;
static long spiral[][]= new long[SIZE][SIZE];
/**
* @param args
*/
public static void main(String[] args) {
double start = System.currentTimeMillis();
long spiral[][]= spiral(SIZE);
long sum = 0;
for(int i = 0; i < SIZE; i++)
{
sum += spiral[i][i];
sum += spiral[i][SIZE - 1 - i];
}
System.out.println(sum - 1);
double time = System.currentTimeMillis() - start;
System.out.println(time);
}
public static long[][] spiral(int size){
if(size == 1){
spiral[SIZE/2][SIZE/2] = 1;
return spiral;
}
else{
long subspiral[][]= spiral(size - 2);
int edge = (SIZE - size)/2;
long counter = subspiral[edge + 1][edge + size - 2];
for(int r = 1; r < size ; r++){
counter++;
spiral[edge + r][edge + size - 1] = counter;
}
for(int c = size - 2; c >= 0; c--){
counter++;
spiral[edge + size - 1][edge + c] = counter;
}
for(int r = size - 2 ; r >= 0 ; r--){
counter++;
spiral[edge + r][edge] = counter;
}
for(int c = 1; c < size ; c++){
counter++;
spiral[edge][edge + c] = counter;
}
return spiral;
}
}
}
Was ist das Problem, das Sie versuchen zu lösen? Kannst du # 28 hier zitieren? –
Sie haben eine nicht benötigte Speicherzuweisung unter: long subspiral [] [] = new lang [Größe - 2] [Größe - 2]; Ihre nächste Zeile sollte einfach lauten: lang subspiral [] [] = Spirale (Größe - 2); – Steven
Problem 28 ist hier: http://projecteuler.net/index.php?section=problems&id=28 Das endgültige Ziel ist es, die Summe des Kreuzes auf einer 1001 von 1001 Spirale zu finden, aber dieser Haufen überflutet bei 100. I Ich werde den Rat von allen versuchen und darüber berichten. – Grantismo