2017-01-16 4 views
1

В настоящее время я пытаюсь найти тринадцать смежных цифр в 1000-значном числе, которое будет иметь наибольший продукт. Теперь я написал функцию, которая должна умножать желаемое количество смежных цифр, которые нужно умножить и затем сохраните продукт в списке. Два параметра, которые выполняет функция, - это требуемое количество смежных цифр и строки, которая содержит номер. Но по какой-то причине он не перестает работать.Поиск наибольшего продукта в C#

public static void giveProduct(int quantity, string word) 
    { 
     int product = 1; 
     int place1 = 0; 
     int place2 = quantity - 1; 
     int temp = 1; 
     string temp2; 

     while (place2 < word.Length) 
     { 
      for (int i = place1; i < place2; i++) 
      { 
       temp2 = word[i].ToString(); 
       temp = Int32.Parse(temp2); 
       product = product * i; 

      } 

      products.Add(product); 
      product = 1; 
      place1 += quantity; 
      place2 += quantity; 
     } 

    } 
+0

@rboe Почему это произойдет, если количество '1'? – InBetween

+2

Ваша программа не делает то, что должно быть. Возьмите номер 1234567 и количество 3. Затем вы проверяете 123 и 456, но никогда не найдете правильный ответ 567. И вы никогда не используете temp; он должен быть product = product * temp. – Nebr

+0

@InBetween - вы правы - было слишком рано утром для моего комментария. –

ответ

3

Невозможно воспроизвести вашу проблему, метод прекращает «правильно» для любого разумного ввода.

Но в любом случае это далеко не единственная проблема в вашей реализации. Ваш метод не правильно вычисляет максимальный продукт, потому что вы пропускаете строку quantity символов за раз. Вы должны пропустить один персонаж за один раз и взять длинную подстроку quantity, начиная с этой позиции.

Для строки 123456 и количества 3 Вы оцениваете 123 и 456. Вы должны проверять 123, 234, 345 и т.д.

Кроме того, получить в привычку:

  1. Пользователи * входы
  2. Написание вспомогательных методов. Чем короче метод, тем сложнее ввести в него ошибку.
  3. Учитывайте все возможные значения, которые может представлять word? Вы считаете { 1234 }? (обратите внимание на начальное и конечное пространства). Как насчет -1234?
  4. Подготовьтесь к худшему. Сделайте свой код надежным, чтобы он мог обрабатывать неверные данные; ваша программа выйдет из строя, если входной сигнал 123$5.

Со всем, что в виду, рассмотрим следующую реализацию:

  1. Первый простой вспомогательный метод, который вычисляет произведение всех цифр данной строки, представляющей число.

    private static bool TryMultiplyDigits(string number, out int product) 
    { 
        Debug.Assert(number != null && number.Length > 0); 
        product = 1; 
    
        foreach (var c in number) 
        { 
         int digit; 
    
         if (int.TryParse(c.ToString(), out digit)) 
         { 
          product *= digit; 
         } 
         else 
          return false; 
        } 
    
        return true; 
    } 
    

    Ok велик, этот метод даст нам правильный продукт или просто скажите нам, что не может оценить его для любого входа.

  2. Теперь, метод, который будет создавать все возможные subtrings и вернуть максимальный продукт найдено:

    public static int GetMaximumProduct(string number, int quantity) 
    { 
        if (number == null) 
         throw new ArgumentNullException(nameof(number)); 
    
        if (quantity < 1) 
         throw new ArgumentOutOfRangeException(nameof(quantity)); 
    
        if (quantity > number.Length) 
         throw new ArgumentException($"{nameof(quantity)} can not be greater than the length of {nameof(number)}."); 
    
        var normalizedNumber = number.Trim(); 
        normalizedNumber = normalizedNumber.StartsWith("-") ? normalizedNumber.Substring(1) : normalizedNumber; 
    
        if (string.IsEmpty(normalizedNumber)) 
        { 
         product = 0; 
         return true; 
        } 
    
        var maximumProduct = 0; 
    
        for (var i = 0; i < normalizedNumber.Length - (quantity - 1); i++) 
        { 
         int currentProduct; 
         if (TryMultiplyDigits(normalizedNumber.Substring(i, quantity), out currentProduct)) 
         { 
          if (currentProduct > maximumProduct) 
          { 
           maximumProduct = currentProduct; 
          } 
         } 
         else 
         { 
          throw new FormatException("Specified number does not have the correct format."); 
         } 
        } 
    
        return maximumProduct; 
    } 
    

И мы сделали!

+0

Теперь я ясно вижу, что я неправильно понял проблему и исказил продукт, спасибо. – Rpmp

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