Как найти произведение ненулевых элементов массива

На фотографии обведено

На фотографии ручкой обведено

Вот пример кода :

  #include <iostream>
  #include<stdio.h>
  #include <windows.h>
  #define i0 6
 #define j0 5
  using namespace std;
 int main()
{
float a[i0][j0];
float b[j0];
int i, j;
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
cout << "nВведіть елементи масиву Аn";
 for (i = 0;i<i0;i++)
      for (j = 0;j<j0;j++)
    {
         printf(" Введіть           A[%i,%i]=  n", i, j);
         cin >> a[i][j];
      }
  for (i = 0;i<i0;i++)
{
      b[i] = 1.0;
    for (j = 0;j<j0;j++)
    {
         if (a[i][j] != 0) b[i]          = b[i] * a[i][j];
       }
    printf("b[%i]=%fn", i,                 b[i]);
}
return 1;
 }

Harry's user avatar

Harry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

задан 28 окт 2021 в 9:28

Тимофій Вознюк's user avatar

1

Диагонали обходятся одним циклом, не вложенным…

double p = 1;
for(int i = 0; i < 6; ++i)
{
    if (a[i][i] != 0) p *= a[i][i];
    if (a[i][5-i] != 0) p *= a[i][5-i];
}

ответ дан 28 окт 2021 в 9:33

Harry's user avatar

HarryHarry

214k15 золотых знаков117 серебряных знаков229 бронзовых знаков

3

Формулы, по которым вычисляется
произведение элементов массива,
аналогичны формулам вычисления сумм:

, (2.4)

. (2.5)

Поэтому вычисление произведения
элементов массива выполнятся по
алгоритмам аналогичным вычислению
суммы. Отличие заключается в том, что
начальное значение произведения p
должно быть равным 1, а в цикле по
параметру i надо вычислять
p=p*ai. Таким образом,
если в графических схемах алгоритмов,
рисунок 2.5 – 2.7 вместо s=0 и s=s+ai
записать p=1 и p=p*ai,
то получим алгоритмы вычисления
произведения элементов массива.

Пример 2.6.

В одномерном массиве a
размерностью n,
вычислить среднее геометрическое
ненулевых элементов массива.

Решение

Среднее геометрическое k элементов
массива – это корень степени k
из произведения этих элементов. Таким
образом, сначала необходимо вычислить
произведение Р ненулевых
элементов массива и их количество k,
а затем среднее геометрическое Sg
по формуле:

. (2.6)

Например, если элементы массива равны
A= {1, 0, 2, 4, 0} то –

Графическая схема алгоритма решения
задачи изображена на рисунке 2.11. В
приведенном алгоритме в цикле по i
(
блоки 5 – 9) помимо вычисления
произведения вычисляется и количество
ненулевых элементов массива. После
цикла с помощью ветвления, проверяется,
есть ли в массиве ненулевые элементы
(k>0 – условие наличия в массиве
ненулевых элементов), в этом случае
вычисляется и выводится среднее
геометрическое. В противном случае
выводится сообщение «В массиве все
элементы равны нулю
«. В программе
переменные Р и Sg имеют
вещественный тип двойной точности
(double), т.к. произведение вещественных
чисел может быть очень большим числом.

Используемые переменные:

n – число элементов массива;

a[] – статический массив;

P – произведение не нулевых элементов
массива;

k – количество не нулевых элементов
массива;

Sg – среднее геометрическое элементов
массива;

i – параметр цикла;

#include <stdio.h>

#include <math.h>

main()

{

float a[20];

int n, i , k;

double P, Sg;

puts(«Введите число элементов
массива a»);

scanf(«%d»,&n);

for (i=0;i<n;i++)

{ printf(«Введите число a[%2d]=»,i);

scanf(«%f»,&a[i]);

}

P=1; k=0;

for(i=0;i<n;i++)

if(a[i]!=0) {P*=a[i]; k++;}

puts(«Массив a»);

for(i=0;i<n;i++)

printf(«a[%2d]=%6.2f n», i, a[i]);

if(k>0)

{

if(P>0) Sg=powl(P,1.0/k);

else Sg= –powl(fabs(P),1.0/k);

printf(«Среднее геометрическое
ненулевых элементов массива =%.4lf n»,
Sg);

printf(«P=%.4lf k=%d n», P, k);

}

else puts(«В массиве все элементы
равны нулю! «);

return(0);

}

Рисунок 2.11 Графическая схема и программа
для примера 2.6

В программе для возведения P в
степень 1/k используется функция
powl(основание, степень), первый
аргумент которой может быть только
положительным числом. Поэтому для
отрицательного P использовано
выражение
,
запись которого на языке С имеет вид:
powl(fabs(P), 1.0/k).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Warburton

0 / 0 / 1

Регистрация: 25.03.2014

Сообщений: 17

1

Произведение ненулевых элементов массива

25.03.2014, 23:29. Показов 5613. Ответов 7

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

помогите, начал изучать С++ недавно, столкнулся с проблемой с массивами
1) Мне нужно создать массив на N элементов (ввожу с клавиатуры) и заполнить случайными вещественными числами
2) И посчитать Произведение ненулевых элементов данного массива
Вопрос: при компиляции выводит не то, сам не могу разобраться почему
Помогите

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{
    setlocale( LC_ALL,"Russian" );
     int N;
     int min;
     double *mass = NULL;
     cout<<"Введите размер массива 'N':= ";
     cin>>N;
     mass = new double [N];
     cout << "Вы создали массив из "<<N<<" вещественных элементовn";
     for (int i=0;i<N;i++) 
     {
            mass[i] = (double) (rand()%1001)/10;  
            cout<<i+1<<" = "<<mass[i]<<endl;
     double s=1.0;
     if (mass[i] != 0)
     {
         s*=mass[i];
     }
     cout << "Произведение ненулевых элементов = " << s << endl;
     }
     delete [] mass;
     system ("pause");
     return 0;
}

Добавлено через 16 минут
как вставить скриншот работы?



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

25.03.2014, 23:29

7

Genn55

413 / 250 / 118

Регистрация: 26.12.2012

Сообщений: 786

25.03.2014, 23:44

2

Лучший ответ Сообщение было отмечено Warburton как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <iostream>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
using namespace std;
int main()
{
    setlocale( LC_ALL,"Russian" );
    srand(time(NULL));
     int N;
 
     double *mass;
 
     cout<<"Введите размер массива 'N':= ";
     cin>>N;
     mass = new double [N];
     cout << "Вы создали массив из "<<N<<" вещественных элементовn";
     for (int i=0;i<N;i++)
     {
            mass[i] = (double) (rand()%100 - 50)/10;
            cout<<i+1<<" = "<<mass[i]<<endl;
     }
     double s=1;
     for (int i=0;i<N;i++)
     {
        if (mass[i] > 0)
         s *= mass[i];
     }
 
     //cout << "Произведение ненулевых элементов = " << s << endl;
 
     cout << "Произведение ненулевых элементов = " << s << endl;
     delete [] mass;
     system ("pause");
     return 0;
}



1



Warburton

0 / 0 / 1

Регистрация: 25.03.2014

Сообщений: 17

25.03.2014, 23:51

 [ТС]

3

а можешь указать на ошибку) не хочется потом каждый раз спрашивать)
как правильно указывать вывод

C++
1
cout << "Произведение ненулевых элементов = " << s << endl;

что бы данная строка выводилась 1 раз ,а не кучу раз, массивом

Добавлено через 4 минуты
Спасибо огромное, добрый человек)
получилось. это у нас идёт курсач, язык С++ учим второй месяц, а задания дали, будто мы пол года изучаем его



0



Genn55

413 / 250 / 118

Регистрация: 26.12.2012

Сообщений: 786

26.03.2014, 00:00

4

Так как у меня написано будет выводиться 1 раз.Но я немного переделал условие так как в вашем случае числа будут большими и вы увидите их в експоненциальном виде.Чтобы увидеть большое число в нормальном виде вам нужно написать

C++
1
 cout << "Произведение ненулевых элементов = " << setw(8) << setprecision(3) << setiosflags (ios::fixed | ios::showpoint)<<s<< endl;

и добавить

C++
1
#include <iomanip>



0



UnsKneD

26.03.2014, 00:10

Не по теме:

Цитата
Сообщение от Warburton
Посмотреть сообщение

язык С++ учим второй месяц, а задания дали, будто мы пол года изучаем его

Да не, всё нормально вам дали. Через пол года уже деревья, стеки, очереди изучать будете,



0



0 / 0 / 1

Регистрация: 25.03.2014

Сообщений: 17

26.03.2014, 00:24

 [ТС]

6

Спасибо огромное)
и ещё последний вопрос, возможно ли в настройках сделать, что бы каждая строка имела номер, т.е. у меня выскочила ошибка в компиляторе указывает номер строки, например, 32 и сидеть считать в коде 32 строку убивает ))



0



413 / 250 / 118

Регистрация: 26.12.2012

Сообщений: 786

26.03.2014, 00:33

7

Лучший ответ Сообщение было отмечено Warburton как решение

Решение

Если я вас правильно понял в вашей среде отсутствует нумерация строк? У меня в кодеблок таких проблем не было какая у вас не знаю.



0



0 / 0 / 1

Регистрация: 25.03.2014

Сообщений: 17

26.03.2014, 00:40

 [ТС]

8

да да, Вы верно поняли. у меня среда Microsoft Visual C++ 2010 Express
точно, Вы подсказали

щас по нему поищу в гугле мануал по Microsoft Visual C++ 2010 Express, всё не буду Вас тревожить)) спасибо за всё ещё раз)
я ставил кодблок, но там что то при компиляции ругался на библиотеки и я его отложил)

Добавлено через 4 минуты
Нашёл ,если кому то интересно будет как Включить нумерацию строк

При помощи меню откройте диалог Tools — Options — Text Editor — All Languages – General и установите флажок на опции Line numbers для того, чтобы включить нумерацию строк во всех типах файлов.



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

26.03.2014, 00:40

8

Given an array consisting of zeros and positive elements, I want to take the product of the non-zero elements. I am currently replacing zeroes with 1’s a[a == 0] = 1 and using np.prod. Given that my array is sparse, one speed up I assume would be to subset for non-zero elements sub = a[a != 0] and take the product over the elements in sub.
Is there a more efficient numpy operation to do do this?

asked Apr 19, 2022 at 6:47

JustBlaze's user avatar

1

Actually, your idea is correct, but it could be shortened to one line code like this:

np.prod(x[x != 0])

answered Apr 19, 2022 at 7:02

Minh-Tuan Nguyen's user avatar

themlgyo

Сумма и произведение ненулевых элементов массива

Sep 27th, 2017

164

0

Never

Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!

  1. Сумма и произведение ненулевых элементов массива

  2. #include <iostream>

  3. using namespace std;

  4. int main()

  5. {

  6.     setlocale(LC_ALL, «RUSSIAN»);

  7. int *arr;

  8. int size;

  9. cout << «Введите размер массива.» << endl;

  10. cout << «n= «;

  11. cin >> size;

  12. if (size <= 0) { // Задаем размер массива

  13. cerr << «Размер массива должен быть положительным» << endl;

  14. return 1;

  15. }

  16.     arr = new int[size]; // Вводим элементы массива

  17. for (int i = 0; i < size; i++) {

  18. cout << «arr[« << i << «] = «;

  19. cin >> arr[i];

  20. }

  21. int S = 0, P = 1;

  22. for (int i = 1; i < size; i++) {

  23. if (arr[i] != 0) {

  24.             S = S + arr[i];

  25.             P = P*arr[i];

  26. }

  27. }

  28. cout << » « << endl;

  29. cout << «Сумма ненулевых элементов массива: « << S << endl;

  30. cout << » « << endl;

  31. cout << «Произведение ненулевых элементов массива: « << P << endl;

  32. delete[] arr;

  33. return 0;

  34. }

Понравилась статья? Поделить с друзьями:
  • Как найти куда котенок ходит в туалет
  • Как составить комплексный план мероприятий
  • Как быстро найти файл на диске
  • Соотношение генотипов в потомстве как найти
  • Как составить сценарий короткометражного фильма