В настоящее время я пытаюсь решить ProjectEuler problem, и у меня все потеряно, кроме скорости. Я почти уверен, что программа выполняется так медленно из-за вложенных циклов. Мне бы хотелось, чтобы некоторые советы о том, как ускорить это. Я новичок программист, поэтому я не знаком с множеством более продвинутых методов/тем.Как ускорить эту программу?
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: Ниже приведен новый код, который экспоненциально быстрее. Также удалена постоянная печать, чтобы ускорить ее.
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, и попытаться использовать bitshifts вместо разделения и умножения, если они доступны в Java –
ли этот алгоритм работа на всех? так что, если 'i = 3', то' num = 6', а затем 'counter = 4', что неверно – afsafzal
@ShaheAnsar, как вы можете предположить, что C для Java быстрее, чем Java, если вы не знаете достаточно, чтобы узнать, поддерживаются бит-сдвиги? – njzk2