Tôi hiện đang cố gắng giải quyết ProjectEuler problem và tôi đã gỡ mọi thứ, ngoại trừ tốc độ. Tôi gần như chắc chắn lý do chương trình thực hiện rất chậm là do các vòng lồng nhau. Tôi rất thích một số lời khuyên về cách tăng tốc độ này. Tôi là một lập trình viên mới, vì vậy tôi không quen thuộc với nhiều phương pháp/chủ đề nâng cao hơn.Làm cách nào để tăng tốc chương trình này?
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: Dưới đây là mã mới nhanh hơn theo cấp số nhân. Loại bỏ các dòng in liên tục cũng như để tăng tốc độ nó lên nhiều hơn.
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;
}
}
}
}
}
}
Hãy thử sử dụng ngôn ngữ nhanh hơn như C và thử sử dụng bithifts thay vì chia và nhân, nếu chúng có sẵn trong Java –
Thuật toán này có hoạt động không? Vì vậy, nếu như 'i = 3' sau đó' num = 6' và sau đó là 'counter = 4' không chính xác là – afsafzal
@ShaheAnsar thì bạn có thể giả định rằng C nhanh hơn Java như thế nào, nếu bạn không biết đủ để biết bithifts được hỗ trợ? – njzk2