目前我正在尝试找到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;
}
}
答案 0 :(得分:3)
无法重现您的问题,该方法正确终止&#34;正确&#34;任何明智的投入。
但无论如何,这远非您实施中的唯一问题。您的方法无法正确计算最大产品,因为您一次跳过字符串quantity
字符。您应该一次跳过一个字符并从该位置开始quantity
长子字符串。
对于字符串123456
和数量3
,您正在评估123
和456
。您应该检查123
,234
,345
等
另外,养成以下习惯:
word
可以代表的所有可能值?你考虑过{ 1234 }
了吗? (注意前导和尾随空格)。 -1234
怎么样?123$5
,您的程序将崩溃。考虑到所有这些,请考虑以下实现:
首先是一个简单的辅助方法,用于评估所有的产品,代表一个数字的给定字符串的数字。
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;
}
好的,这种方法会给我们正确的产品,或者只是告诉我们它无法评估任何输入。
现在,这个方法将创建所有可能的子字符串并返回找到的最大产品:
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;
}
我们已经完成了!