Ich versuche gerade eine ProjectEuler problem zu lösen und ich habe alles außer der Geschwindigkeit runter. Ich bin fast sicher, der Grund, warum das Programm so langsam ausgeführt wird, liegt an den verschachtelten Schleifen. Ich würde gerne Ratschläge bekommen, wie man das beschleunigen kann. Ich bin ein Anfänger Programmierer, so dass ich nicht mit vielen der fortgeschrittenen Methoden/Themen vertraut bin.Wie würde ich dieses Programm beschleunigen?
public class Problem12 {
public static void main(String[] args) {
int num;
for (int i = 1; i < 15000; i++) {
num = i * (i + 1)/2;
int counter = 0;
for (int x = 1; x <= num; x++) {
if (num % x == 0) {
counter++;
}
}
System.out.println("[" + i + "] - " + num + " is divisible by " + counter + " numbers.");
}
}
}
EDIT: Unten ist der neue Code, der exponentiell schneller ist. Der Druck der konstanten Linie wurde ebenfalls entfernt, um die Geschwindigkeit noch zu erhöhen.
public class Problem12 {
public static void main(String[] args) {
int num;
outerloop:
for (int i = 1; i < 25000; i++) {
num = i * (i + 1)/2;
int counter = 0;
double root = Math.sqrt(num);
for (int x = 1; x < root; x++) {
if (num % x == 0) {
counter += 2;
if (counter >= 500) {
System.out.println("[" + i + "] - " + num + " is divisible by " + counter + " numbers.");
break outerloop;
}
}
}
}
}
}
Versuchen Sie, eine schnellere Sprache wie C verwenden und versuchen bitshifts statt Divisionen und Multiplikationen verwenden, wenn sie überhaupt in Java –
Ist dieser Algorithmus Arbeit verfügbar sind? Also wie wenn 'i = 3' dann' num = 6' und dann 'counter = 4' was falsch ist – afsafzal
@ShaheAnsar Wie kannst du davon ausgehen, dass C schneller ist als Java für diesen Fall, wenn du nicht genug weißt um es zu wissen Bitshifts werden unterstützt? – njzk2