2015-02-05 3 views
-1

Итак, я работал над proj euler 8 и в итоге получил разочарование и обманул. Я видел ответ, который я нашел https://github.com/nayuki/Project-Euler-solutions/blob/master/java/p008.java работал так же, как и с другим кодом, но всякий раз, когда у меня был другой ответ.Тот же код, другой ответ? Project Euler8

Итак, я сменил строки и начал копировать свой код, чтобы увидеть, где был недостаток, но в конце концов, когда я все изменил и сделал свой код таким же, как и его (с разными именами переменных), у меня все еще есть другое ответ. Может ли кто-нибудь объяснить мне, почему это происходит? Первый - это мой код, второй - его.

public class Attempt { 
    public static void main (String[] args) { 
      System.out.println(new Attempt().getAnswer()); 
    } 


    private static final String BIG_NUMBER = "I copied and pasted his number here, so no difference. I won't write it out since it's 1000 digits." 
    private static final int ADJACENT = 13; 

    public String getAnswer() { 
      long highest = -1; 
      for (int i = 0; i + ADJACENT <=BIG_NUMBER.length(); i++) { 

        long currentProduct = 1; 

        for (int thirteen = 1; thirteen < ADJACENT; thirteen++) 

          currentProduct *= BIG_NUMBER.charAt(i + thirteen) '0'; 


        highest = Math.max(currentProduct, highest); 

      } 
      return Long.toString(highest); 
    } 

} 


public class Cheat { 

    public static void main(String[] args) { 
      System.out.println(new Cheat().run()); 
    } 


    private static final String NUMBER = "7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801$ 
    private static final int ADJACENT = 13; 


    public String run() { 
      long maxProd = -1; 
      for (int i = 0; i + ADJACENT <= NUMBER.length(); i++) { 
        long prod = 1; 
        for (int j = 0; j < ADJACENT; j++) 
          prod *= NUMBER.charAt(i + j) - '0'; 
        maxProd = Math.max(prod, maxProd); 
      } 
      return Long.toString(maxProd); 
    } 

} 
+2

«_my code то же, что и его_». Один цикл начинается с 0, другой начинается с 1. Коды не совпадают. – csmckelvey

+0

Ваш код даже не компилируется: 'currentProduct * = BIG_NUMBER.charAt (i + thirteen) '0';' это довольно значительная разница. – Bohemian

ответ

1

Ваш код:

for (int thirteen = 1; thirteen < ADJACENT; thirteen++) // Not 0 based 
    currentProduct *= BIG_NUMBER.charAt(i + thirteen) '0'; // Error 

Должен быть изменен на:

for (int thirteen = 0; thirteen < ADJACENT; thirteen++) 
     currentProduct *= BIG_NUMBER.charAt(i + thirteen)- '0'; 

PS: int thirteen звучит как его постоянная, использовать лучшее название вместо этого.

1

Java String (s) и массив (ы) начинаются от 0 (не 1).

for (int thirteen = 0; thirteen < ADJACENT; thirteen++) 

или (я предполагаю, что у вас есть опечатка, когда отсутствует знак минус для '0' ниже)

currentProduct *= BIG_NUMBER.charAt(i + thirteen - 1) - '0'; 

Примечаниеi + thirteen - 1. Кроме того, ваше имя переменной thirteen выглядит относительно менее наглядным, чем j ... по крайней мере, у меня не возникло бы искушение подумать, что j всегда равно 13.