2017-01-16 7 views
1

現在、私は最大のproduct.Now 1000桁の数字に隣接する13の桁を見つけるしようとしている乗算される隣接する数字の希望数を掛けることになっている関数を書いている後で製品をリストに格納することができます。関数が取る2つのパラメータは、隣接する数字の数と数字を含む文字列です。しかし何らかの理由でそれは走りを止めることができません。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は決して見つかりません。 product = product * tempである必要があります。 – Nebr

+0

@InBetween - あなたが正しいです - 私のコメントのために朝早すぎました。 –

答えて

3

問題を再現できません。適切な入力があれば、このメソッドは「正しく」終了します。

しかし、とにかく、それはあなたの実装の唯一の問題から遠いです。一度に文字列quantityをスキップしているため、メソッドが最大製品を正しく計算していません。一度にの1つを文字にスキップし、その位置から始まる長いサブストリングをquantityとする必要があります。

文字列123456と量3の場合は、123456と評価されています。

ヘルパーメソッドを書くの入力
  • を検証
    1. :あなたはの習慣を身に取得し、またなど123234345

      をチェックする必要があります。方法が短ければ短いほど、バグを導入するのが難しくなります。

    2. wordが表すことができるすべての値を考慮してください。 { 1234 }を考えましたか? (先頭と末尾のスペースに注意してください)。どのように-1234については?
    3. 悪いことに備える。間違ったデータを扱うことができるようにコードを堅固にします。入力が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; 
      } 
      

      大丈夫ですが、この方法は正しい製品を提供するか、入力に対して評価できないと伝えます。

    4. 今、最高の製品を、すべての可能な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

    関連する問題