Разбор задач

Очень важно пытаться искать решения самостоятельно

Задача 4. Найти максимальное значение в массиве

Необходимо предварительно создать переменную max. Присвоить ей значение любого элемента массива, например array[0]. В каждой итерации цикла сравнивать значение ячейки с переменной max, если значение больше, то помещать значение ячейки в max. В итоге получим максимальное.


Задача 7. Найти предмаксимальное

Проще всего создать дополнительный массив и создавать в нем ячейки с ключами которые в основном массиве это значение. Например: а[х]=7, следовательно b[7]=1. 1 это просто условность, чтобы создать ячейку. Потом просматривая массив b мы видим максимальное в последней ячейке по номеру ключа. И нам нужен ключ предпоследней ячейки.


Задача 8. Найти максимальное в каждом блоке

Решение похоже на поиск максимального значения. Надо пройти весь массив в одном цикле, но создать дополнительную переменную-счетчик которая будет отсчитывать 10 шагов. Каждые 10 шагов будет выводится найденное максимальное, обнуляться счетчик 10 шагов, обнуляться переменная max.


Задача 9. Поменять блоки местами

Пример простого универсального решения:

bl = 10
b1 = 3 * bl
b2 = 7 * bl

for(n=0; n < bl; n++){

k1 = b1 + n
k2 = b2 + n

x = a[k1]
a[k1] = a[k2]
a[k2] = x

}

Дополнение. В процессоре есть машинная команда которая копирует сразу блок байтов из одного места в другое. Такая команда работает быстрее чем переносить по одной ячейке. К сожалению в си и тем более php, мы не можем использовать эту команду напрямую. Но мы можем сделать простой цикл который переносит последовательно все ячейки блока. Тогда компилятор си скорее всего поймет что мы хотим и использует команду блочного копирования.


Задача 3 часть 2. Найти одинаковые значения

Можно сравнить последовательно ячейки одного массива со всеми ячейками второго. Использовать два вложенных цикла. Перед сравнением создать переменную-флаг равную 0. Если значения равны, то устанавливать флаг равно 1 и break. После сравнения если флаг 1, то вывести число.

Дополнение. На самом деле сравнивать все ячейки друг с другом очень медленно. Так если у нас массивы по миллиону ячеек, то надо будет сделать триллион сравнений. Это тяжело даже для современных компьютеров. Можно создать дополнительный массив-индекс, ключи которого будут соответствовать значениям основных массивов. Например: а[7]=4, следовательно i[4]=1. Значения в индекс можно записать так. Сперва все ячейки равны 0. Значения которые есть в первом массиве будут 1. При проходе второго массива значение индекса будет 2 если было 1, и будет 3 если было 0. Таким образом просматривая массив-индекс по значениям мы получим искомые числа. А количество сравнений будет всего два миллиона.

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


Дополнительная задача

Это поиск простых чисел методом исключения (решето Эратосфена). Такой метод намного быстрее чем деление чисел, так как деление это тяжелая команда и процессор выполняет его долго, а здесь мы лишь складываем, вычитаем и меняем значения ячеек.

// создадим массив
x = 100000
for(n=3; n < x; n+=2){
a[n] = 1
}

// обнулим кратные
for(n=3; n < x; n+=2){
n2 = n * 2
for(m=n2; m < x; m+=n){
a[m] = 0
}
}

// выведем и посчитаем
for(n=3; n < x; n+=2){
if(a[n]){
k++
print(n)
}
}
print(k)

×
Рассказать друзьям:
© 2025 Apexuite
Информация на сайте представлена в ознакомительных целях и не является публичной офертой
На сайте используется cookie и определяется ваш IP-адрес для сбора статистики о посещаемости страниц сайта
Панель управления