在c#中找到最大的产品

时间:2017-01-16 07:43:07

标签: c#

目前我正在尝试找到1000位数字中具有最大产品的十三个相邻数字。现在我写了一个函数,该函数应该乘以所需的相邻数字相乘以后再存储产品在列表中。函数采用的两个参数是所需的相邻数字和包含数字的字符串。但出于某种原因,它不会停止运行。

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

    }   

1 个答案:

答案 0 :(得分:3)

无法重现您的问题,该方法正确终止&#34;正确&#34;任何明智的投入。

但无论如何,这远非您实施中的唯一问题。您的方法无法正确计算最大产品,因为您一次跳过字符串quantity字符。您应该一次跳过一个字符并从该位置开始quantity长子字符串。

对于字符串123456和数量3,您正在评估123456。您应该检查123234345

另外,养成以下习惯:

  1. 验证输入
  2. 编写帮助方法。方法越短,就越难在其中引入错误。
  3. 考虑word可以代表的所有可能值?你考虑过{ 1234 }了吗? (注意前导和尾随空格)。 -1234怎么样?
  4. 做好准备。使您的代码健壮,以便能够处理不正确的数据;如果输入为123$5,您的程序将崩溃。
  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. 现在,这个方法将创建所有可能的子字符串并返回找到的最大产品:

      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;
      }
      
    3. 我们已经完成了!