2017-01-16 85 views
1

目前我正在試圖找到十三個相鄰的數字,將在1000位數字,將有最大的product.Now我寫了一個函數,應該乘以所需的相鄰數字數相乘並稍後將產品存儲在列表中。這兩個函數所需的參數是所需數量的相鄰數字和包含數字的字符串。但由於某種原因,它不會停止運行。在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;它應該是產品=產品*溫度。 – Nebr

+0

@InBetween - 你說得對 - 我的評論早上太早了。 –

回答

3

無法重現您的問題,該方法終止「正確」的任何明智的輸入。

但無論如何,這遠遠不是您實施中唯一的問題。您的方法無法正確計算最大產品,因爲您一次只能跳過字符串quantity。您應該一次跳過一個字符,並從該位置開始計算quantity長子字符串。

對於字符串123456和數量3你正在評估123456。您應該檢查123234345

此外,進入的習慣:

  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; 
    } 
    

    好的,這種方法會給我們正確的產品或者只是告訴我們它不能評估它的任何輸入。現在

  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