Поиск ближайшего числа в массиве

Материал из UoPilot
Версия от 21:54, 27 августа 2019; Tatikoma (обсуждение | вклад) (Новая страница: «== Описание == Есть число N и массив с числами. Нужно найти в массиве ближайшее к N число. <br...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Описание

Есть число N и массив с числами. Нужно найти в массиве ближайшее к N число. <br>Принцип работы скрипта: <br>Массив с числами разбивается на 2 массива. В одном числа, которые меньше N, во втором, которые больше N. <br>Из первого массива берётся последнее число, оно будет ближайшим из тех что меньше N. <br>Из второго берётся первое число, оно будет ближайшим из тех что больше N. <br>Из двух чисел выбирается ближайшее к N.

Версия

1.0

Минимальная версия UOPilot

2.38

Скрипт

set linedelay 0                               // задержка между строк
log mode compact                              // компактный режим лога 
init_arr %a 10 20 30 40 50 60 70 80 90 100    // массив с числами
sort_array %a                                 // сортировка массива (нужна если массив не сортирован) 
set #N random(120)                            // псевдослучайное число от 0 до 119 (число N)

set #z 0
set #z1 0
set size(%b)
set size(%b1)
for #i 1 size(%a)
    if  #N > %a [#i]
        set #z #z + 1
        set %b [#z] %a [#i]
    else
        set #z1 #z1 + 1
        set %b1 [#z1] %a [#i]
    end_if
end_for
if  size(%b) != 0 and size(%b1) != 0
    set #min #N - %b [size(%b)]
    set #max %b1 [1] - #N
    if  #min < #max              // если заменить на: if  #min <= #max, то, к примеру, 35 будет ближе к 30, чем к 40
        set #x %b [size(%b)]
    else
        set #x %b1 [1]
    end_if
else
    if  size(%b) = 0
        set #x %a [1]
    else
        set #x %a [size(%a)]
    end_if
end_if
log N = #N, ближайшее число: #x
// set #pos indexof(%a (#x))           // если нужно узнать позицию ближайшего числа в массиве
// log Позиция числа в массиве: #pos
end_script

Смотрите также

Массивы <br>Load_array <br>Save_array <br>If <br>For

Первоисточник