Помогите решить задачу C#
В одномерном массиве, состоящем из n целых элементов, вычислить:
- номер максимального элемента массива;
- произведение элементов массива, расположенных между первым и вторым нулевыми элементами.
{
int max = myArray.Max();
int index = Array.FindLastIndex(myArray, delegate (int q) { return q == max; });
Console.WriteLine("номер максимального элемента массива;: {0}", index);
Console.ReadLine();
}
Ответы (2 шт):
Автор решения: aepot
→ Ссылка
Вот обе задачи в одном коде, я думаю, вы без труда сможете разделить.
static void Main(string[] args)
{
Console.Write("Введите количество элементов массива: ");
int length = int.Parse(Console.ReadLine());
int[] myArray = new int[length];
for (int i = 0; i < myArray.Length; i++)
{
Console.Write($"Введите элемент {i}: ");
myArray[i] = int.Parse(Console.ReadLine());
}
int max = array[0];
int maxIndex = 0;
int zeroFirstIndex = -1;
int zeroSecondIndex = -1;
for (int i = 0; i < myArray.Length; i++)
{
if (max < array[i]) // ищем индекс максимального элемента
{
max = array[i];
maxIndex = i;
}
if (array[i] == 0) // ищем индексы первого и второго нуля
{
if (zeroFirstIndex == -1)
zeroFirstIndex = i;
else if (zeroSecondIndex == -1)
zeroSecondIndex = i;
}
}
Console.WriteLine($"Индекс максимального элемента массива: {maxIndex}");
if (zeroFirstIndex >= 0 && zeroSecondIndex >= 0) // если оба нуля найдены
{
int multiply;
if (zeroSecondIndex - zeroFirstIndex == 1)
multiply = 0;
else
{
multiply = 1;
for (int i = zeroFirstIndex + 1; i < zeroSecondIndex; i++)
multiply *= array[i];
}
Console.WriteLine($"Произведение чисел между нулями: {multiply}");
}
else
Console.WriteLine($"В массиве меньше двух нулей.");
}
Автор решения: pasx
→ Ссылка
Вот две версии алгоритма.
Вы хотите пройти через массив только один раз. Поэтому С первой версией мы умножаем, читая массив.
Вторая версия с LinQом.
var max = int.MinValue;
var maxIndex = -1;
int? m = null;
var multiply = false;
for (var index = 0; index < _data.Length; index++)
{
var i = _data[index];
//compute max
if (i > max)
{
max = i;
maxIndex = index;
}
if (i == 0)
{
multiply = !multiply;
if(m == null) m = 0;
continue;
}
if (multiply)
{
if (m == 0) m = 1;
m *= i;
}
}
//Версия с LinQом
var m2 = _data.SkipWhile(i => i != 0)
.Skip(1)
.TakeWhile(i => i != 0)
.Aggregate((i, j) => i * j);
var max2 = _data.Max();
В двух версиях есть проблема, если массив содержит несколько серий нулевых пар. Лучшее решение разбивает массив на подмассивы, а затем обрабатывает каждый из них.
