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

clockwork_orang

0 / 0 / 0

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

Сообщений: 20

1

Не могу посчитать сумму максимальных элементов каждой строки

24.04.2013, 17:57. Показов 1969. Ответов 7

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


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

Не могу посчитать сумму максимальных элементов каждой строки.
Вообще задание звучит так: В матрице действительных чисел вычислить сумму их наибольших значений в строках и наименьших в столбцах.
Я брала матрицу 2х3. Не знаю почему не правильно выводит max элемент строки..
Вот код который у меня получился:

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
#pragma argsused
#include<iostream.h>
int main(int argc, char* argv[])
{const int n=2, m=3;
int A[n][m], Sum1, Sum2;
int i, j;
for(i=0; i<n; i++)
  for(j=0; j<m; j++)
  {cout<<"Vvedite element A="<<endl;
  cin>>A[i][j];
  }
 
cout<<"n Vivod matrici A:"<<endl;
for(i=0; i<n; i++)
  {for(j=0; j<m; j++) cout<<A[i][j]<<" ";
  cout<<endl;
  }
 
Sum1=0;
int max=A[i][0];
for(j=1; j<m; j++)
if(A[i][j]>max) {max=A[i][j]; cout<<"max="<<max;
Sum1=Sum1+max;}
cout<<"Sum1="<<Sum1;
system("pause");
        return 0;
}



0



yoghurt92

381 / 352 / 113

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

Сообщений: 1,049

24.04.2013, 18:53

2

clockwork_orang,

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
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <iomanip>
#include <string>
#include <time.h>
#include <cstdlib>
using namespace std;
 
#define str 4
#define stb 4
 
int main()
{
    srand(time(NULL));
    int mas[str][stb];
 
    for(int i = 0; i < str; ++i)
        for(int j = 0; j < stb; ++j)
            mas[i][j] = rand() % 21;
 
    cout << "Matrix:n";
    for(int i = 0; i < str; ++i){
        cout << "nt";
        for(int j = 0; j < stb; ++j)
            cout << setw(3) << mas[i][j] << ' ';
    }
 
    int sum_s(0), sum_b(0), max, min;
    for(int i = 0; i < str; ++i){
        max = mas[i][0];
        min = mas[0][i];
        for(int j = 1; j < stb; ++j){
            if(max < mas[i][j])
                max = mas[i][j];
 
            if(min > mas[j][i])
                min = mas[j][i];
        }
 
        sum_s += max;
        sum_b += min;
    }
 
    cout << "nnMax: " << sum_s << "tMin: " << sum_b;
 
    cout << "nn";
    return 0;
}



0



0 / 0 / 0

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

Сообщений: 20

24.04.2013, 18:58

 [ТС]

3

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

srand(time(NULL))

я такого еще не проходила… не могу разобраться что здесь к чему((

Добавлено через 1 минуту
и библиотек таких не знаю(



0



381 / 352 / 113

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

Сообщений: 1,049

24.04.2013, 19:04

4

clockwork_orang, это для рандомного заполнения, чтобы не вводить с клавиатуры, мы заполняем матрицы случайными числами А если в действительности, то вам нужна только вот эта часть

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

int sum_s(0), sum_b(0), max, min;
* * for(int i = 0; i < str; ++i){
* * * * max = mas[i][0];
* * * * min = mas[0][i];
* * * * for(int j = 1; j < stb; ++j){
* * * * * * if(max < mas[i][j])
* * * * * * * * max = mas[i][j];
if(min > mas[j][i])
* * * * * * * * min = mas[j][i];
* * * * }
sum_s += max;
* * * * sum_b += min;
* * }
cout << «nnMax: » << sum_s << «tMin: » << sum_b;



0



clockwork_orang

0 / 0 / 0

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

Сообщений: 20

24.04.2013, 19:21

 [ТС]

5

yoghurt92 посмотри пожалуйста, я ввела тот кусок и вот что у меня в итоге вышло:

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
#pragma argsused
#include<iostream.h>
int main(int argc, char* argv[])
{const int n=2, m=3;
int A[n][m], Sum1, Sum2;
int i, j;
for(i=0; i<n; i++)
  for(j=0; j<m; j++)
  {cout<<"Vvedite element A="<<endl;
  cin>>A[i][j];
  }
 
cout<<"n Vivod matrici A:"<<endl;
for(i=0; i<n; i++)
  {for(j=0; j<m; j++) cout<<A[i][j]<<" ";
  cout<<endl;
  }
 
  int sum_s(0), sum_b(0), max, min;
 for(int i = 0; i < n; ++i){
 max = A[i][0];
 min = A[0][i];
 for(int j = 1; j < m; ++j){
 if(max < A[i][j])
 max = A[i][j];
if(min > A[j][i])
 min = A[j][i];
}
sum_s += max;
 sum_b += min;
}
cout << "nnMax: " << sum_s << "tMin: " << sum_b;
system("pause");
 
        return 0;
}

max считает правильно, а min нет… может я не так ввела??



0



yoghurt92

381 / 352 / 113

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

Сообщений: 1,049

24.04.2013, 19:37

6

clockwork_orang, потому что мой вариант для квадратной матрицы, если нужно для прямоугольной надо изменить, сейчас покажу как

Добавлено через 7 минут
clockwork_orang,

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
37
38
39
40
41
42
43
44
45
46
47
#include "stdafx.h"
#include<iostream>
using namespace std;
 
int main(int argc, char* argv[])
{const int n=2, m=3;
int A[n][m];
int i, j;
for(i=0; i<n; i++)
  for(j=0; j<m; j++)
  {cout<<"Vvedite element A="<<endl;
  cin>>A[i][j];
  }
 
cout<<"n Vivod matrici A:"<<endl;
for(i=0; i<n; i++)
  {for(j=0; j<m; j++) cout<<A[i][j]<<" ";
  cout<<endl;
  }
 
  int sum_s(0), sum_b(0), max, min;
    for(int i = 0; i < n; ++i){
        max = A[i][0];
        for(int j = 1; j < m; ++j){
            if(max < A[i][j])
                max = A[i][j];
        }
 
        sum_s += max;
    }
 
    for(int i = 0; i < m; ++i){
        min = A[0][i];
        for(int j = 1; j < n; ++j){
            if(min > A[j][i])
                min = A[j][i];
        }
 
        sum_b += min;
    }
 
cout << "nnMax: " << sum_s << "tMin: " << sum_b;
system("pause");
 
cout << "nn";
        return 0;
}



1



0 / 0 / 0

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

Сообщений: 20

24.04.2013, 19:52

 [ТС]

7

yoghurt92, Спасибо!!! Теперь все понятно



0



381 / 352 / 113

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

Сообщений: 1,049

24.04.2013, 19:59

8

clockwork_orang,



0



Дана матрица 4×4. Нужно найти сумму наибольших элементов строк матрицы.
Алгоритм создал, но, бывает, выдает отрицательные числа. Я думаю, проблема в том, что когда элементы строки матрицы, следующие за первым и больше первого, повторяются, алгоритм не срабатывает.

35 30 35 20

15 15 25 25

35 30 20 15

20 15 35 20

Помогите решить это.
Алгоритм в коде помечен комментарием.

Код:

class Lab2
{
    public static void main(String[] args)
    {
         byte a = 5;
         byte sum = 0, max;
         byte B[][] = new byte[4][4];
         byte C[][] = new byte[4][4];

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 B[i][j] = (byte) (3 + (int) (Math.random() * 5));
             } 
         }

         System.out.println("Matrix B:");

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 System.out.print(B[i][j] + " ");
             }
             System.out.println();
         }

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 C[i][j] = (byte) (B[i][j] * a);
             } 
         }

         System.out.println("Matrix C:");

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 System.out.print(C[i][j] + " ");
             }
             System.out.println();
         }
         //counting the sum of the greatest elements of each row

         for(int i = 0; i < 4; i++)  // ПРОБЛЕМА ЗДЕСЬ
         {
             max = C[i][0];
             for(int j = 1; j < 4; j++)
             {
                 if(C[i][j] > max)
                 {
                     max = C[i][j];
                 }
             }
             sum += max;
         }
         System.out.println("The sum of the greatest elements of each row is: " + sum);
    }
}

задан 9 фев 2018 в 21:35

Andrey Safonov's user avatar

Вы используете для всех целочисленных переменных тип byte, который в Java имеет диапазон от -128 до 127. Если при прибавлении к такой переменной получается число больше 127, происходит т.н. переполнение и результирующее значение будет, можно сказать, циклически сдвинуто по этому диапазону. Результат будет не тот, который ожидался.

Если в матрице B у вас относительно небольшие числа, то в матрице A они могут достигать 35. То есть тип самой матрицы выбран верно. Но сумма максимальных элементов строк уже может достигать 35*4 = 140, что при переполнении даст

-128 + (140 - 128) = -116  // вычитаем переполнение

Соответственно, для переменной sum нужно использовать более «широкий» тип, например, short.

ответ дан 9 фев 2018 в 22:03

Кирилл Малышев's user avatar

Кирилл МалышевКирилл Малышев

10.8k1 золотой знак18 серебряных знаков34 бронзовых знака

In native Python, min and max have key functions:

>>> LoT=[(1, 2), (3, 4), (5, 6), (7, 8)]
>>> min(LoT, key=sum)
(1, 2)
>>> max(LoT, key=sum)
(7, 8)

If you want the index of the first min or max in Python, you would do something like:

>>> min(((i, t) for i, t in enumerate(LoT)), key=lambda (i,x): sum(x))
(0, (1, 2))

And then peel that tuple apart to get what you want. You also could use that in numpy, but at unknown (to me) performance cost.


In numpy, you can do:

>>> a=np.array(LoT)
>>> a[a.sum(axis=1).argmin()]
array([1, 2])
>>> a[a.sum(axis=1).argmax()]
array([7, 8])

To get the index only:

>>> a.sum(axis=1).argmax()
3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {
            double[,] a = new double[3, 4];
 
            Random r = new Random();
            for(int i =0;i<3;i++)
                for (int j = 0; j < 4; j++)
                {
                    a[i, j] = r.NextDouble();
                }
 
            double currMax = 0;
            double sum = 0;
 
            for (int i = 0; i < 3; i++)
            {
                for (int j = 0; j < 4; j++)
                {
                    Console.Write(String.Format("{0:f}  ", a[i, j]));
                }
                Console.WriteLine();
            }
 
 
            for (int i = 0; i < 3; i++)
            {
                currMax = a[i, 0];
                for (int j = 0; j < 4; j++)
                {
                    if (a[i, j] > currMax) currMax = a[i, j];                    
                }
                sum += currMax;                
            }
            Console.WriteLine("{0:f}",sum);
            Console.ReadKey();
        }
    }
}

дан двумерный массив. найдите сумму наибольших значений элементов его строк

const
N = 10;
M = 20;

var
a: array [1..N, 1..M] of integer;
i: integer;
j: integer;
sum: integer;
max: integer;
begin
{инициализируем массив случайными числами}
for i:=1 to N do begin
for j:=1 to M do begin
a[i, j]:=random(100);
end;
end;

{выведем его на экран}
for i:=1 to N do begin
for j:=1 to M do begin
write(a[i, j]:3);
end;
writeln;
end;
writeln;

sum:=0; {начальная инициализация суммы}
write('max: ');
for i:=1 to N do begin
{находим максимальное значение в строке}
max:=a[i, 1];
for j:=2 to M do begin
if a[i, j] > max then begin
max:=a[i, j];
end;
end;
write(max:3); {вывод на экран}
sum:=sum+max; {накапливаем сумму}
end;
writeln;

writeln('сумма максимальных элементов строк = ', sum);
end.

тут можно скачать отформатированную версию исходников

Понравилась статья? Поделить с друзьями:

Не пропустите также:

  • Как найти инстаграм человека через телеграмм
  • Как в тексте найти одинаковые выражения
  • Как составить карту склада
  • Как найти запчасть к таврии
  • Как найти авто по имени владельца

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии