2015-12-22 4 views
-1

Я пытался выяснить, почему моя программа не будет работать для этой проблемы. Речь идет об усеченных простых числах.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 - один из них.

+0

Что ваш вопрос? –

+0

За исключением 442, явно не являющегося простым, что выглядит ... смутно разумным. Почему, по-вашему, вы должны достичь 3797? –

+0

ОК, поэтому ... вместо того, чтобы останавливаться после поиска первых 10 ('while (counter <10) {'), остановитесь после поиска первого 11. –

ответ

2

Номера, такие как 11, 13,31, 71, 113, не имеют левого и правого усечения, поскольку 1 не является простым числом.
Вы должны изменить свою функцию isPrime(), чтобы включить этот случай. Тогда только у вас будет ровно 11 простых чисел до 3797.
В противном случае вы получите 11 номеров в первых 1000 номерах, которые будут сбиты, когда вы запустите этот код. изменить Также

(while (counter < 10) {) 

в

(while (counter < 11) {) 
+0

Это должен быть комментарий, а не ответ. –

+0

Это ответ, он просто должен изменить свою функцию isPrime, чтобы включить этот случай, так как тогда он даст точные результаты. В противном случае в этой функции он получит 11 усеченных чисел в первых 1000 числах самих – wolfsgang

+0

Но вы не объясните, что в вашем ответе: вы просто говорите «это неправильно». Пожалуйста, разверните свой ответ. Кроме того, код найдет только 10 усеченных номеров. –