2015-11-19 7 views
2

Я знаю, что мой код может быть проще и эффективнее ... Мой код должен захватить самый большой набор из 5 цифр. Он работает, за исключением того, что он захватывает только 3 цифры, что мне нужно изменить, чтобы изменить это?Строка с 1000 цифрами, найти самые большие 5 цифр без массива

public class thousandDigits { 
    public static void main(String[] args) { 
     int greatest = 0; 
     String num = ("73167176531330624919225119674426574742355349194934" 
       + "96983520312774506326239578318016984801869478851843" 
       + "85861560789112949495459501737958331952853208805511" 
       + "12540698747158523863050715693290963295227443043557" 
       + "66896648950445244523161731856403098711121722383113" 
       + "62229893423380308135336276614282806444486645238749" 
       + "30358907296290491560440772390713810515859307960866" 
       + "70172427121883998797908792274921901699720888093776" 
       + "65727333001053367881220235421809751254540594752243" 
       + "52584907711670556013604839586446706324415722155397" 
       + "53697817977846174064955149290862569321978468622482" 
       + "83972241375657056057490261407972968652414535100474" 
       + "82166370484403199890008895243450658541227588666881" 
       + "16427171479924442928230863465674813919123162824586" 
       + "17866458359124566529476545682848912883142607690042" 
       + "24219022671055626321111109370544217506941658960408" 
       + "07198403850962455444362981230987879927244284909188" 
       + "84580156166097919133875499200524063689912560717606" 
       + "05886116467109405077541002256983155200055935729725" 
       + "71636269561882670428252483600823257530420752963450"); 

     for (int n = 0; n < num.length() - 5; n++) { 
      greatest = ((num.charAt(n)) + (num.charAt(n+1)) + (num.charAt(n+2)) + (num.charAt(n+3)) 
        + (num.charAt(n+4))); 
      if (greatest > n) { 
       n = greatest; 
      } 
     } 
     System.out.print(greatest); 
    } 
} 

ВЫВОД:

357 
+1

Ваш код не работает. Существует 3-значное число 963, которое больше 357. – vvp

+1

Я думаю, вы имеете в виду 'num.charAt (n + 1)' not '(num.charAt (n) +1)'. Кроме того, вам нужно умножить первую цифру на 10^(6-n), где n = 1 для начала для каждой цифры n = 1 ... 5 – stanfordude

ответ

2

Хотя @ElliottFrisch и обеспечивает более @ Dave элегантный ответ, я попытался изменить из вашей оригинальной версии и вот мой код (я тестировал):

public class ThousandDigits { 
    public static void main(String[] args) { 
     int greatest = 0; 
     String num = ("73167176531330624919225119674426574742355349194934" 
       + "96983520312774506326239578318016984801869478851843" 
       + "85861560789112949495459501737958331952853208805511" 
       + "12540698747158523863050715693290963295227443043557" 
       + "66896648950445244523161731856403098711121722383113" 
       + "62229893423380308135336276614282806444486645238749" 
       + "30358907296290491560440772390713810515859307960866" 
       + "70172427121883998797908792274921901699720888093776" 
       + "65727333001053367881220235421809751254540594752243" 
       + "52584907711670556013604839586446706324415722155397" 
       + "53697817977846174064955149290862569321978468622482" 
       + "83972241375657056057490261407972968652414535100474" 
       + "82166370484403199890008895243450658541227588666881" 
       + "16427171479924442928230863465674813919123162824586" 
       + "17866458359124566529476545682848912883142607690042" 
       + "24219022671055626321111109370544217506941658960408" 
       + "07198403850962455444362981230987879927244284909188" 
       + "84580156166097919133875499200524063689912560717606" 
       + "05886116467109405077541002256983155200055935729725" 
       + "71636269561882670428252483600823257530420752963450"); 

     int max = -1; 
     for (int n = 0; n < num.length() - 4; n++) { 
      greatest = ((num.charAt(n) - '0') * 10000 + (num.charAt(n + 1) - '0') * 1000 
        + (num.charAt(n + 2) - '0') * 100 + (num.charAt(n + 3) - '0') * 10 + (num.charAt(n + 4) - '0')); 
      if (max < greatest) { 
       max = greatest; 
      } 
     } 
     System.out.print(max); 
    } 
} 
+0

@Frank Большое спасибо! –

+1

Зачем вам умножать num.charAt на 1000 для первых 2, а затем 100 для третьего, а затем только 10 для последнего? – Frank

+1

@Frank Потому что из вашего вопроса я считаю, что мы находим самые большие 5 цифр (например, 99890), а не сумму из 5 цифр (например, 9 + 9 + 8 + 9 + 0 = 35). Поэтому нам нужно восстановить число, считая первые 9 как 90000 (поэтому умножьте его на 10000), второе 9 - 9000 и т. Д. Имеет ли это смысл? –

2

Я думаю, вы обнаружите, что это не захват трех цифр, а сумма шести символов, вытаскивают является 3-значное число.

Если вы получили наибольшее пятизначное число, вам нужно извлечь пять цифр (не шесть), как и вы, и присвоить им вес. Таким образом, первая цифра должна быть умножена на 10 000, вторая на 1000 и так далее.

Но есть еще: вы получаете символ по индексу внутри вашей строки. Это не то, что вы хотите, поскольку это не то же самое, что числовое значение этого символа. Для этого вам необходимо:

num.charAt(n) - '0' 

Эти изменения должны позволить вам исправить ваш алгоритм в его нынешнем виде.

Более эффективным подходом было бы извлечь 5-значные подстроки и преобразовать их в целые числа. Первый из них будет:

Integer.parseInt(num.subString(0, 5)); 

Вы можете перебирать, чтобы найти каждого, чтобы найти наибольший.

+1

Это 'подстрока', и это' (0, n] '. [Javadoc] (http://docs.oracle.com/javase/8/docs/api/java/lang/String.html # substring-int-int-) говорит (частично) * Подстрока начинается с указанного 'beginIndex' и продолжается до символа в индексе' endIndex - 1'. * –

+1

@ ElliottFrisch Вы правы. Ответ отредактирован для исправления. – dave

3

Я думаю, вы хотите использовать String.substring(int, int) для повторения всех возможных 5 символов подстрок, а затем вы можете использовать Math.max(int, int) для обновления greatest. Что-то вроде

int greatest = Integer.MIN_VALUE; 
for (int i = 0; i < num.length() - 4; i++) { 
    // int value = Integer.parseInt(num.substring(i, i + 5)); 
    int value = Integer.parseInt(String.valueOf(num.charAt(i)) 
       + num.charAt(1 + i) + num.charAt(2 + i) + num.charAt(3 + i) 
       + num.charAt(4 + i)); 
    greatest = Math.max(greatest, value); 
} 
System.out.println(greatest); 

Я получаю 99890.

+1

Я не должен использовать subString еще в этой программе, я ценю помощь, хотя – Frank

+2

@Frank Edited. В следующий раз, пожалуйста, перечислите все свои ограничения, чтобы быстрее помочь вам (вы сказали, что нет массивов). –

2

Я думаю, что вы пытаетесь добавить 5 последовательные символы, чтобы получить сумму, и сохранить начальный индекс наибольшей суммы.

Но вы должны использовать Character.getNumricValue(char) для преобразования (num.charAt (n)) в числовое значение, а затем добавить.

greatest = Character.getNumericValue((num.charAt(n)) + Character.getNumericValue((num.charAt(n+1)) + Character.getNumericValue((num.charAt(n+2)) + 
Character.getNumericValue((num.charAt(n+3)) + 
Character.getNumericValue((num.charAt(n+4)); 

Вам нужно valirable хранить старое значение для сравнения и индекс

if(greatest > oldGreatest) { 
    index = n; 
} 

Затем, наконец, печать с использованием индекса из боковой петли:

System.out.print((num.charAt(index)) + (num.charAt(index+1) + (num.charAt(index +2)) + (num.charAt(index +3)) + (num.charAt(index +))); 

 Смежные вопросы

  • Нет связанных вопросов^_^