Şu anda bir ProjectEuler problem çözülmeye çalışıyorum ve her şeyim var, hız hariç. Programın çok yavaş yürütmesinin sebebinin iç içe döngülerden kaynaklandığından neredeyse eminim. Bunu hızlandırmak için bazı tavsiyeleri çok isterim. Ben acemi bir programcıyım, bu yüzden daha gelişmiş yöntemler/konular ile aşina değilim.Bu programı nasıl hızlandırabilirim?
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.");
}
}
}
DÜZENLEME: Aşağıda katlanarak hızlıdır yeni kodudur. Daha fazla hızlandırmak için sabit çizgi baskısını da kaldırdı. bölenler bakarken kare kökü aşağıdaki her bölen üzerinde bir eşdeğer olduğundan
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;
}
}
}
}
}
}
C gibi daha hızlı bir dil kullanmayı deneyin ve onlar Java –
mevcut iseniz bu algoritma çalışması hiç mi, bitshifts yerine bölünme ve çarpma kullanmayı deneyin? Yani "i = 3" sonra "num = 6" ve sonra "counter = 4" yanlış – afsafzal
@ShaheAnsar gibi C'nin bunun için Java'dan daha hızlı olduğunu nasıl tahmin edersiniz? bitshifts desteklenir? – njzk2