我有一个任务,我需要找到数组中所有数字的乘积,我不知道该怎么做。
int[] numbers = new int[SIZE];
Console.WriteLine("Type in 10 numbers");
Console.WriteLine("To stop, type in 0");
for (int input = 0; input < SIZE; input++)
{
userInput = Console.ReadLine();
numberInputed = int.Parse(userInput);
if (numberInputed == ZERO)
{
numberInputed = ONE;
break;
}
else
{
numbers[input] = numberInputed;
}
}
这是我试图找到阵列中所有数字的乘积的地方。
foreach (int value in numbers)
{
prod *= value;
}
Console.WriteLine("The product of the values you entered is {0}", prod);
我在foreach声明中做错了什么?提前致谢
编辑,遗漏了我声明的值
const int SIZE = 10;
const int ZERO = 0;
string userInput;
int numberInputed;
int prod = 1;
当我键入所有十个值时,它现在有效但是如果我为了打破循环而放置一个0,那么一切都等于0.如何阻止0进入数组?
答案 0 :(得分:20)
您可以将prod
初始化为0,这意味着无论数组中的数字是多少,prod
都将保持为0.请确保将其初始化为1以获得正确的结果:
int prod = 1;
foreach (int value in numbers)
{
prod *= value;
}
你也可以使用Linq的Aggregate
扩展方法做同样的事情:
using System.Linq; // put with other using directives
int prod = numbers.Aggregate(1, (a, b) => a * b);
<强>更新强>
真正的问题(我之前没有注意到)是你的数组没有完全填充,如果你提前摆脱你的循环。因此,您未设置的任何数组条目仍会初始化为0.要解决此问题,请使用List<int>
代替int[]
:
using System.Collections.Generic; // put with other using directives
List<int> numbers = new List<int>(SIZE); // Capacity == SIZE
...
for (int input = 0; input < SIZE; input++)
{
...
if (numberInputed == ZERO)
{
break;
}
else
{
numbers.Add(numberInputed);
}
}
答案 1 :(得分:1)
问题在于,您无法跟踪数组中实际分配了值的项目数。如果使用零输入退出循环,则其余项目保持不变。由于默认情况下它们为零,因此您将在第二个循环中使用这些零,并且当数组中某处为零时,总产品将变为零。
通过将循环变量保持在循环之外来跟踪有多少项:
int input = 0;
while (input < SIZE)
{
userInput = Console.ReadLine();
numberInputed = int.Parse(userInput);
if (numberInputed == ZERO) {
break;
}
numbers[input] = numberInputed;
input++;
}
现在您只能使用实际分配的项目:
for (int i = 0; i < input; i++) {
prod *= numbers[i];
}
答案 2 :(得分:0)
将数组中的所有数字相乘
int[] array = { 1, 2, 3, 4, 5 };
int sum = array[0];
for (int i = 1; i != array.Length; i++)
{
sum *= array[i];
}
如果您的数组以某种方式填充了零(0),请使用列表代替数组。