|
clockwork_orang 0 / 0 / 0 Регистрация: 03.04.2013 Сообщений: 20 |
||||
|
1 |
||||
Не могу посчитать сумму максимальных элементов каждой строки24.04.2013, 17:57. Показов 1969. Ответов 7 Метки нет (Все метки)
Не могу посчитать сумму максимальных элементов каждой строки.
0 |
|
yoghurt92 381 / 352 / 113 Регистрация: 17.05.2012 Сообщений: 1,049 |
||||
|
24.04.2013, 18:53 |
2 |
|||
|
clockwork_orang,
0 |
|
0 / 0 / 0 Регистрация: 03.04.2013 Сообщений: 20 |
|
|
24.04.2013, 18:58 [ТС] |
3 |
|
srand(time(NULL)) я такого еще не проходила… не могу разобраться что здесь к чему(( Добавлено через 1 минуту
0 |
|
381 / 352 / 113 Регистрация: 17.05.2012 Сообщений: 1,049 |
|
|
24.04.2013, 19:04 |
4 |
|
clockwork_orang, это для рандомного заполнения, чтобы не вводить с клавиатуры, мы заполняем матрицы случайными числами
int sum_s(0), sum_b(0), max, min;
0 |
|
clockwork_orang 0 / 0 / 0 Регистрация: 03.04.2013 Сообщений: 20 |
||||
|
24.04.2013, 19:21 [ТС] |
5 |
|||
|
yoghurt92 посмотри пожалуйста, я ввела тот кусок и вот что у меня в итоге вышло:
max считает правильно, а min нет… может я не так ввела??
0 |
|
yoghurt92 381 / 352 / 113 Регистрация: 17.05.2012 Сообщений: 1,049 |
||||
|
24.04.2013, 19:37 |
6 |
|||
|
clockwork_orang, потому что мой вариант для квадратной матрицы, если нужно для прямоугольной надо изменить, сейчас покажу как Добавлено через 7 минут
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
Вы используете для всех целочисленных переменных тип byte, который в Java имеет диапазон от -128 до 127. Если при прибавлении к такой переменной получается число больше 127, происходит т.н. переполнение и результирующее значение будет, можно сказать, циклически сдвинуто по этому диапазону. Результат будет не тот, который ожидался.
Если в матрице B у вас относительно небольшие числа, то в матрице A они могут достигать 35. То есть тип самой матрицы выбран верно. Но сумма максимальных элементов строк уже может достигать 35*4 = 140, что при переполнении даст
-128 + (140 - 128) = -116 // вычитаем переполнение
Соответственно, для переменной sum нужно использовать более «широкий» тип, например, short.
ответ дан 9 фев 2018 в 22:03
Кирилл МалышевКирилл Малышев
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.
тут можно скачать отформатированную версию исходников


А если в действительности, то вам нужна только вот эта часть