Как найти максимальную сумму в массиве паскаль

Перейти к содержанию

Найти массив с максимальной суммой элементов

Просмотров 673 Обновлено 15 октября 2021

Сгенерировать десять массивов из случайных чисел. Вывести их и сумму их элементов на экран. Найти среди них один с максимальной суммой элементов. Указать какой он по счету, повторно вывести этот массив и сумму его элементов.

Заполнение массива и подсчет суммы его элементов оформить в виде отдельной функции.

Если сохранять все массивы нет необходимости, то тогда задача решается проще.

В основной ветке программы создается два массива. Один для хранения массива с максимальной суммой элементов, а второй — для хранения текущего массива.

В функцию передается ссылка на текущий массив. Там он заполняется, выводится на экран и вычисляется сумма его элементов, которую функция возвращает в основную ветку программы.

Если сумма элементов текущего массива оказывается больше, чем значение переменной, предназначенной для хранения максимальной суммы, то текущий массив присваивается переменной, предназначенной для хранения массива с максимальной суммой элементов. Кроме того в отдельной переменной запоминается номер этого массива. В конце программы массив, его номер по счету и сумма элементов выводятся на экран.

Pascal


const N = 15;
type arr = array[1..N] of integer;
var
arr_max, arr_new: arr;
sum_max, sum_new, i, id: integer;

function new_array(var a: arr): integer;
var k: byte;
begin
new_array := 0;
for k:=1 to N do begin
a[k] := random(50);
write(a[k]:4);
new_array := new_array + a[k];
end;
writeln(' - ', new_array);
end;

begin
randomize;
sum_max := 0;
id := 1;
for i:=1 to 10 do begin
sum_new := new_array(arr_new);
if sum_new > sum_max then begin
arr_max := arr_new;
sum_max := sum_new;
id := i;
end;
end;
writeln;
writeln(id, '-й массив с максимальной суммой элементов:');
for i:=1 to N do
write(arr_max[i]:4);
writeln(' - ', sum_max);
end.



3 29 24 7 30 28 37 30 7 4 23 18 26 18 10 - 294
2 39 2 35 15 33 35 37 16 8 35 37 8 22 47 - 371
1 36 47 21 49 35 44 40 27 16 36 15 43 12 19 - 441
13 2 9 21 9 13 13 26 32 15 12 32 14 19 7 - 237
0 11 7 11 27 13 23 9 33 19 21 9 31 9 7 - 230
10 9 33 22 5 25 1 40 36 25 15 41 39 8 38 - 347
17 13 44 18 32 18 22 11 19 40 26 29 15 2 0 - 306
20 33 35 21 1 4 3 33 7 10 8 33 12 10 5 - 235
36 33 31 26 44 33 18 17 27 42 15 12 19 8 34 - 395
21 29 48 41 31 42 34 0 17 37 36 33 11 12 42 - 434

3-й массив с максимальной суммой элементов:
1 36 47 21 49 35 44 40 27 16 36 15 43 12 19 - 44

Язык Си


#include < stdio.h>
#define N 15
int array(int a[]);

main() {
int arr_new[N], arr_max[N], i, j, id, sum_max, sum_new;
srand(time(NULL));
id = 0;
sum_max = 0;
for (i=1; i<=10; i++) {
sum_new = array(arr_new);
if (sum_new > sum_max) {
sum_max = sum_new;
for (j=0; j< N; j++) arr_max[j] = arr_new[j];
id = i;
}
}
printf("n%d-й массив с максимальной суммой элементов:n", id);
for (i=0; i< N; i++) printf("%4d", arr_max[i]);
printf(" - %dn", sum_max);
}

int array(int a[]) {
int k, sum;
sum = 0;
for (k=0; k< N; k++) {
a[k] = rand()%50;
sum += a[k];
printf("%4d", a[k]);
}
printf(" - %dn", sum);
return sum;
}

Нельзя напрямую присвоить один массив другому.

Python


from random import random

def array(a):
s = 0
for i in range(15):
a[i] = int(random()*50)
print("%4d" % a[i], end='')
s += a[i]
print(" - %d" % s)
return s

arr_new = [0]*15
sum_max = 0
index = -1
arr_max = -1
for i in range(10):
sum_new = array(arr_new)
if sum_new > sum_max:
sum_max = sum_new
index = i+1
arr_max = arr_new[:]

print("%d-й массив имеет максимальную сумму элементов:" % index)
print(arr_max, ' - ', sum_max)

Выражение arr_max = arr_new[:] присваивает копию массива. Иначе — создавалась бы еще одна ссылка на текущий массив arr_new, и в конце выводился бы последний массив, а не с наибольшей суммой (сама сумма выводилась бы правильно).

КуМир


цел Н = 15
цел таб а[1:Н]
алг
нач
цел сч, сч2, индекс, сумма, сумма_текущая
цел таб б[1:Н]
сумма := 0
индекс := 1
нц для сч от 1 до 10
сумма_текущая := массив
если сумма < сумма_текущая то
сумма := сумма_текущая
индекс := сч
нц для сч2 от 1 до Н
б[сч2] := а[сч2]
кц
все
кц
вывод индекс, "-й массив имеет максимальную сумму элементов:", нс
нц для сч от 1 до Н
вывод б[сч], " "
кц
вывод " - ", сумма
кон

алг цел массив
нач
цел сч
знач := 0
нц для сч от 1 до Н
а[сч] := int(rand(0,50))
вывод а[сч], " "
знач := знач + а[сч]
кц
вывод " - ", знач, нс
кон

Переменные-массивы нельзя присваивать друг другу.

uses crt;
const nmax=15;
var a:array[1..nmax,1..nmax] of integer;
    m,n,i,j,imx:byte;
    sm,mx:integer;
begin
randomize;
repeat
write('Количество строк до ',nmax,' m=');
read(m);
until m in [1..nmax];
repeat
write('Количество столбцов до ',nmax,' n=');
read(n);
until n in [1..nmax];
writeln('Исходная матрица:');
writeln(' №','Сумма:':n*4+8);
mx:=-maxint-1;
imx:=0;
for i:=1 to m do
 begin
  write(i:2);
  sm:=0;
  for j:=1 to n do
   begin
    a[i,j]:=random(20);
    write(a[i,j]:4);
    sm:=sm+a[i,j];
   end;
  writeln(sm:6);
  if sm>mx then
   begin
    mx:=sm;
    imx:=i;
   end;
 end;
writeln;
write('Максимальная сумма=',mx,' в строке ',imx);
end.

Динамика по паре (позиция в массиве, количество оставшихся действий).

Пусть f(i, k) — максимальная сумма которую можно набрать за k действий стартуя с позиции i. Для неё верны следующие соотношения:

f(0, k)                            # искомая величина
f(i >= len(a), *) = 0              # вышли за пределы массива a
f(*, k <= 0) = 0                   # кончились действия
f(i, k) <= f(i + 1, k - 1)         # двигаемся, a[i] не взяли
f(i, k) <= a[i] + f(i + 1, k - 2)  # взяли a[i] и сдвинулись на шаг

Программа:

import functools


def max_sum(a, k):

    @functools.cache
    def f(i, k):
        if k <= 0:
            return 0
        if i >= len(a):
            return 0
        return max(
            a[i] + f(i + 1, k - 2),
            f(i + 1, k - 1)
        )

    return f(0, k)


print(max_sum([5, 7, 11], 3))
print(max_sum([15, 17, 13, 20], 2))
print(max_sum([15, 17, 13, 20], 100))
$ python max-sum.py
12
17
65

К обработке элементов одномерного массива можно отнести такие типы задач:

1. найти сумму элементов;

2. найти количество элементов;

3. заменить элементы по условию;

4. поиск максимального и минимального значений.

Рассмотрим эти задачи на двух языках программирования

Найти сумму элементов массива (сложить все элементы массива).

ps_summ.jpg

py_summ.jpg

Рис. (1). Программа на Pascal Рис. (2). Программа на Python

Найти сумму по условию, например сумму чётных элементов (сложить все чётные элементы массива).

ps_xtn.jpg

py_чет.jpg

Рис. (3). Программа на Pascal Рис. (4). Программа на Python

Найти количество элементов по сложному условию, например кратных (7) и не кратных (5) и (3).

ps_k_sl_usl.jpg

колво.jpg

Рис. (5). Программа на Pascal Рис. (6). Программа на Python

Заменить все отрицательные элементы на модуль элемента.

ps_zamena.jpg

py_zam.jpg

Рис. (7). Программа на Pascal Рис. (8). Программа на Python

Способов поиска максимального и минимального значений элементов массива существует множество. Остановимся на таком способе:

1. допустим, что максимальное значение равно меньшему из диапазона;

2. сравним его со всеми элементами массива поочерёдно;

3. всегда найдётся значение большее, чем начальное, поэтому запомним его в переменную, которую ввели для поиска максимального значения.

Задача на поиск максимального элемента

Заполнить массив элементами в диапазоне от (-10) до (20). Найти максимальный элемент массива.

макс.jpg

Рис. (9). Алгоритм поиска максимального элемента массива

ps_max.jpg

py_max.jpg

Рис. (10). Поиск максимального

элемента на Pascal

Рис. (11). Поиск максимального

элемента на Python

Аналогично происходит поиск минимального элемента.

Источники:

Рис. 1. Программа на Pascal. © ЯКласс.

Рис. 2. Программа на Python. © ЯКласс.

Рис. 3. Программа на Pascal. © ЯКласс.

Рис. 4. Программа на Python. © ЯКласс.

Рис. 5. Программа на Pascal. © ЯКласс.

Рис. 6. Программа на Python. © ЯКласс.

Рис. 7. Программа на Pascal. © ЯКласс.

Рис. 8. Программа на Python. © ЯКласс.

Рис. 9. Алгоритм поиска максимального элемента массива. © ЯКласс.

Рис. 10. Поиск максимального элемента на Pascal. © ЯКласс.

Рис. 11. Поиск максимального элемента на Python. © ЯКласс.

Задание:

Дан целочисленный массив из 30 элементов. Элементы массива могут принимать произвольные целые значения. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит сумму наибольшей по длине возрастающей последовательности подряд идущих элементов. Если таких последовательностей несколько, можно вывести любую из них. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.

Паскаль

  1. const N=30; 
  2. var a: array [1..N] of integer; 
  3.     i, l, lmax, s, smax: integer; 
  4. begin
  5.   for i:=1 to N do readln(a[i]); 
  6.   …
  7. end.

Си

  1. #include<stdio.h> 
  2. int main(void) {
  3.   const int N=30; 
  4.   int a[N]; 
  5.   int i, l, lmax, s, smax; 
  6.   for (i=0; i<N; i++)
  7.     scanf(″%d″, &a[i]); 
  8.   …
  9. }

Естественный язык

Объявляем массив A из 30 элементов. Объявляем целочисленные переменные i, l, lmax, s, smax.

В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й.

 Решение:

Обратим внимание, что нужно найти не длину, а сумму наибольшей (то есть, самой длинной!) возрастающей последовательности (то есть, такой, в которой каждый следующий элемент строго больше предыдущего).  В переменных l и s будем хранить длину и сумму текущей (рассматриваемой сейчас) последовательности, а в переменных lmax и smax – значения для наибольшей последовательности.

Решение на естественном языке. Записываем в переменную lmax начальное значение 0, в переменную l – значение 1, а в переменную smax – значение первого элемента массива. В цикле рассматриваем все элементы массива, начиная со 2-ого до 30-ого. Если очередной элемент больше предыдущего, увеличиваем переменную  l на 1, а к переменной s добавляем значение этого элемента; иначе записываем 1 в переменную l и значение этого элемента в s. После этого (в теле цикла) сравниваем l и lmax; если l > lmax (нашли новую самую длинную возрастающую цепочку), записываем значение s в smax.

Решение на Паскале. 

const N=30;
var a: array [1..N] of integer;
    i, l, lmax, s, smax: integer;
begin
  for i:=1 to N do readln(a[i]);
  lmax:=0; l:=1; s:=a[1];
  for i:=2 to N do begin
    if a[i] > a[i-1] then begin
      l:=l+1; s:=s+a[i]
    end
    else begin
      l:=1; s:=a[i]
    end;  
    if l > lmax then begin
      lmax:=l;
      smax:=s
    end
  end;
  writeln(smax) 
end.

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