Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Помощь с кодом C#

fsa fsa Ученик (169), на голосовании 7 месяцев назад
Я не понимаю как это работает , моментами он работает как надо , а в другие моменты он делает что то не так.
Моё задание :дан массив из n элементов . найти и вывести количество и наименьшую сумму пар элементов последовательности ,удвоенная сумма которых больше максимального нечётного элемента в последовательности ( пара - два подряд идущих элемента)

Вот например :
тут он всё выполнил отлично

а вот тут не отлично

вот код

Дополнен 8 месяцев назад
Вот код полностью

static void Main(string[] args)
{
int udvoen = 0;
int sum = 0;
int minsum = int.MaxValue;
int[] array = fullarray();
int max = MaxElem(array);
for (int i = 0 ; i < array.Length-1; i++)
{
int c = array[i] + array[i+1];
if (c < minsum)
{
minsum = c;
if (minsum * 2 > max)
{
udvoen = minsum;
}
}
sum++;

}
Console.WriteLine("Минимальная сумма элементов :" +minsum);
Console.WriteLine("Максимальный нечётный элемент :" + max);
Console.WriteLine("Минимальная удовенная сумма элементов больше максимального элемента :" + udvoen*2 + " ; сумма этих элементов:"+ minsum);
}
static int [] fullarray()
{
Console.WriteLine ("Введите количество элементов массива");
int N = int.Parse(Console.ReadLine());
int [] array = new int[N];
for (int i = 0; i < N; i++)
{
Console.WriteLine ("Введите элементы массива");
array[i] = int.Parse(Console.ReadLine());
}
return array;
}
static int MaxElem(int[] array)
{

int Max = int.MinValue;
foreach ( int num in array)
{
if (num % 2!=0 && num > Max)
{
Max = num;
}
}
return Max;
}
Голосование за лучший ответ
Андрей Панарин Искусственный Интеллект (242690) 8 месяцев назад
Вот тут:
 if (c < minsum)
{
minsum = c;
if (minsum * 2 > max)
{
udvoen = minsum;
}
}
Элементы: 1 2 7 2 5.

В начале имеем max = 7, minsum = int.MaxValue.

Сначала c = 3 (1 + 2).
c < minsum (3 < int.MaxValue), поэтому запоминаем minsum = 3.
minsum * 2 < max (3 * 2 < 7), поэтому udvoen не трогаем, он по-прежнему 0.

Далее c = 9 (2 + 7).
c > minsum (9 > 3), поэтому не трогаем minsum и udvoen.

Аналогично пропускаем суммы c = 9 (7 + 2) и c = 7 (2 + 5).

В итоге имеем udvoen = 0.
Почему? Потому что мы запомнили minsum = 3, которая при удвоении НЕ превышает максимальный элемент. А все значения больше него просто не рассматривали.

По идее, проверка на minsum лишняя. Нужно сравнивать це не с minsum, а с udvoen, который в начале равен int.MaxValue, а потом постепенно уменьшается.

Я бы сделал цикл так:
 for (int i = 0 ; i < array.Length-1; i++)  
{
int c = array[i] + array[i+1];
if (c < minsum)
{
minsum = c;
}
if (c * 2 > max && c < udvoen)
{
udvoen = c;
}
sum++;
}
Теперь поиск минимального minsum = c никак не влияет на поиск минимального udvoen.
fsa fsaУченик (169) 8 месяцев назад
Я поменял код , но всё равно , он показывает то же самое
Андрей Панарин Искусственный Интеллект (242690) Самое интересное осталось за кадром. Или у вас претензии к первым двум результатам 3 и 7?
Похожие вопросы