Я пытался выяснить, почему моя программа не будет работать для этой проблемы. Речь идет об усеченных простых числах.Project Euler 37 Java
Оригинал Проблема
Номер 3797 имеет интересное свойство. Будучи простым, можно непрерывно удалять цифры слева направо и оставаться первичными на каждом этапе: 3797, 797, 97 и 7. Аналогичным образом мы можем работать справа налево: 3797, 379, 37 и 3.
Найдите сумму только одиннадцати простых чисел, которые обе усекаются слева направо и справа налево.
ПРИМЕЧАНИЕ: 2, 3, 5 и 7 не считаются усеченными штрихами.
Я думаю, что у меня есть Truncatable часть программы правильно:
public static boolean isTruncatable(String x) {
int num = 0;
for (int i = 0; i < x.length(); i++) {
num = Integer.parseInt(x.substring(0, x.length() - i));
if (!isPrime(num)) {
return false;
}
System.out.println("From right: " + num);
num = Integer.parseInt(x.substring(i, x.length()));
if (!isPrime(num)) {
return false;
}
System.out.println("From left: " + num);
}
return true;
}
Бег, что с "3797" в качестве входных данных отпечатков
From right: 3797
From left: 3797
From right: 379
From left: 797
From right: 37
From left: 97
From right: 3
From left: 7
Остальные программы
public class Problem37TruncatablePrimes {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int counter = 0, sum = 0, i = 10;
while (counter < 10) {
if (isPrime(i)) {
if (isTruncatable(Integer.toString(i))) {
sum += i;
counter++;
System.out.println(i);
}
}
i++;
}
System.out.println(sum);
long stop = System.currentTimeMillis();
System.out.println((stop - start) + "ms");
}
public static boolean isTruncatable(String x) {
int num = 0;
for (int i = 0; i < x.length(); i++) {
num = Integer.parseInt(x.substring(0, x.length() - i));
if (!isPrime(num)) {
return false;
}
num = Integer.parseInt(x.substring(i, x.length()));
if (!isPrime(num)) {
return false;
}
}
return true;
}
public static boolean isPrime(int x) {
if (x == 2) {
return true;
}
if (x % 2 == 0) {
return false;
}
for (int i = 2; i <= Math.sqrt(x); i++) {
if (x % i == 0) {
return false;
}
}
return true;
}
}
Он не доходит до 3797 и печатает
11
13
17
23
31
37
53
71
73
113
442
Спасибо за помощь.
Редактировать: Проблема была в том, что 1 не является простым числом, поэтому благодаря вольфсгану для указания этого. Кроме того, я хотел, чтобы он перешел на 3797, потому что проблема заключалась в том, что есть только 11 Truncatable простых чисел и 3797 - один из них.
Что ваш вопрос? –
За исключением 442, явно не являющегося простым, что выглядит ... смутно разумным. Почему, по-вашему, вы должны достичь 3797? –
ОК, поэтому ... вместо того, чтобы останавливаться после поиска первых 10 ('while (counter <10) {'), остановитесь после поиска первого 11. –