Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2019, 22:52   #1
San_n
Новичок
Джуниор
 
Регистрация: 16.12.2019
Сообщений: 1
По умолчанию Перемножение массива

Добрый день!

Пытаюсь разобраться с заданием. Нужно найти произведение ненулевых элементов массива. Сам массив изначально состоит из 45 элементов (рандомно от -20 до 11)
Вот что у меня получается:

Код:
int[] data = new int[45];
Random obj = new Random();
            for (int i = 0; i < data.Length; i++) 
            {
                data[i] = obj.Next(-20, 11);

                Console.Write("{0,3}", data[i]);
            }



А далее пытаюсь сделать перемножение, но не получается 

int proizv = 1;
for (int i = 0; i < data.Length; i++)
            {
                if (data[i]!=0)
                {
                  proizv *= data[i];

                    
                }
            }
Console.WriteLine("\n\nProizvedenie elementov: {0}", proizv);
Выдает ответ: 0. Может подскажите, где ошибка?
San_n вне форума Ответить с цитированием
Старый 17.12.2019, 05:36   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Цитата:
Сообщение от San_n Посмотреть сообщение
где ошибка?
Ошибка в переполнении.
Полученное произведение слишком велико, чтобы поместиться в int.
Поэтому у результата отсекаются старшие разряды
А почему получается 0? Да потому, что в массиве достаточно чётных сомножителей, чтобы младшие разряды обнулились.

Примерно так:
Код:
-1622261760(9f4e4000) * -6 = 1143635968(442a8000)
1143635968(442a8000) * -18 = 889389056(35030000)
889389056(35030000) * 8 = -1474822144(a8180000)
-1474822144(a8180000) * -5 = -1215823872(b7880000)
-1215823872(b7880000) * -13 = -1374158848(ae180000)
-1374158848(ae180000) * 1 = -1374158848(ae180000)
-1374158848(ae180000) * -6 = -344981504(eb700000)
-344981504(eb700000) * 2 = -689963008(d6e00000)
-689963008(d6e00000) * -17 = -1155530752(bb200000)
-1155530752(bb200000) * -19 = 480247808(1ca00000)
480247808(1ca00000) * -6 = 1413480448(54400000)
1413480448(54400000) * -18 = 327155712(13800000)
327155712(13800000) * -2 = -654311424(d9000000)
-654311424(d9000000) * 3 = -1962934272(8b000000)
-1962934272(8b000000) * -13 = -251658240(f1000000)
-251658240(f1000000) * -8 = 2013265920(78000000)
2013265920(78000000) * -5 = -1476395008(a8000000)
-1476395008(a8000000) * 8 = 1073741824(40000000)
1073741824(40000000) * 2 = -2147483648(80000000)
-2147483648(80000000) * 9 = -2147483648(80000000)
-2147483648(80000000) * -2 = 0(0)
Кстати, иногда проскакивает и ненулевой результат - двоек не хватает

Последний раз редактировалось Black Fregat; 17.12.2019 в 05:38.
Black Fregat вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# перемножение элементов массива ekacibizova Помощь студентам 8 13.11.2014 07:30
Перемножение ahvahsky2008 Microsoft Office Excel 4 13.09.2010 00:14
Перемножение матриц Elysey Общие вопросы C/C++ 3 15.03.2010 20:18
Перемножение одномерного массива на двумерный daget Помощь студентам 4 14.12.2009 06:27