Получите максимальное количество потолков от числа в linux (BASH) - программирование
Подтвердить что ты не робот

Получите максимальное количество потолков от числа в linux (BASH)

Как бы я сделал что-то вроде:

ceiling(N/500)

N, представляющее число.

Но в linux Bash script

4b9b3361

Ответ 1

Вызовите скриптовый язык с функцией ceil. С учетом $NUMBER:

python -c "from math import ceil; print ceil($NUMBER/500.0)"

или

perl -w -e "use POSIX; print ceil($NUMBER/500.0), qq{\n}"

Ответ 2

Зачем использовать внешние языки script? По умолчанию вы получаете слово. Чтобы получить ceil, do

$ divide=8; by=3; let result=($divide+$by-1)/$by; echo $result
3
$ divide=9; by=3; let result=($divide+$by-1)/$by; echo $result
3
$ divide=10; by=3; let result=($divide+$by-1)/$by; echo $result
4
$ divide=11; by=3; let result=($divide+$by-1)/$by; echo $result
4
$ divide=12; by=3; let result=($divide+$by-1)/$by; echo $result
4
$ divide=13; by=3; let result=($divide+$by-1)/$by; echo $result
5
....

Чтобы учитывать отрицательные числа, вы можете немного увеличить его. Вероятно, более чистые пути, но для начинающих

$ divide=-10; by=10; neg=; if [ $divide -lt 0 ]; then let divide=-$divide; neg=1; fi; let result=($divide+$by-1)/$by; if [ $neg ]; then let result=-$result; fi; echo $result
-1

$ divide=10; by=10; neg=; if [ $divide -lt 0 ]; then let divide=-$divide; neg=1; fi; let result=($divide+$by-1)/$by; if [ $neg ]; then let result=-$result; fi; echo $result
1

Ответ 3

Здесь используется решение с использованием bc (которое должно быть установлено почти везде):

ceiling_divide() {
  ceiling_result=`echo "($1 + $2 - 1)/$2" | bc`
}

Здесь другое чисто в bash:

# Call it with two numbers.
# It has no error checking.
# It places the result in a global since return() will sometimes truncate at 255.

# Short form from comments (thanks: Jonathan Leffler)
ceiling_divide() {
  ceiling_result=$((($1+$2-1)/$2))
}

# Long drawn out form.
ceiling_divide() {
  # Normal integer divide.
  ceiling_result=$(($1/$2))
  # If there is any remainder...
  if [ $(($1%$2)) -gt 0 ]; then
    # rount up to the next integer
    ceiling_result=$((ceiling_result + 1))
  fi
  # debugging
  # echo $ceiling_result
}

Ответ 4

Вы можете использовать awk

#!/bin/bash
number="$1"
divisor="$2"
ceiling() {
  awk -vnumber="$number" -vdiv="$divisor" '
  function ceiling(x){return x%1 ? int(x)+1 : x}
  BEGIN{ print ceiling(number/div) }'
}
ceiling

Выход

$ ./shell.sh 1.234 500
1

Или, если есть выбор, вы можете использовать лучшую оболочку, которая плавающая запятая, например Zsh

integer ceiling_result
ceiling_divide() {
  ceiling_result=$(($1/$2))
  echo $((ceiling_result+1))
}

ceiling_divide 1.234 500

Ответ 5

Floor () {
  DIVIDEND=${1}
  DIVISOR=${2}
  RESULT=$(( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ))
  echo ${RESULT}
}
R=$( Floor 8 3 )
echo ${R}

Ceiling () {
  DIVIDEND=${1}
  DIVISOR=${2}
  $(( ( ( ${DIVIDEND} - ( ${DIVIDEND} % ${DIVISOR}) )/${DIVISOR} ) + 1 ))
  echo ${RESULT}
}
R=$( Ceiling 8 3 )
echo ${R}

Ответ 6

Развернув немного на отличный ответ Kalle, здесь алгоритм прекрасно упакован в функцию:

ceildiv() {
    local num=$1
    local div=$2
    echo $(( (num + div - 1) / div ))
}

или как однострочный:

ceildiv(){ echo $((($1+$2-1)/$2)); }

Если вы хотите получить фантазию, вы можете использовать более надежную версию, проверяющую ввод, чтобы проверить, являются ли они численными, также обрабатывает отрицательные числа:

ceildiv() {
    local num=${1:-0}
    local div=${2:-1}
    if ! ((div)); then
        return 1
    fi
    if ((num >= 0)); then
        echo $(( (num + div - 1) / div ))
    else
        echo $(( -(-num + div - 1) / div ))
    fi
}

Это использует "поддельный" ceil для отрицательных чисел, к наивысшему абсолютному целому числу, т.е. -10/3 = -4, а не -3, как следует, как -3 > -4. Если вы хотите "истинный" потолок, используйте $(( num / div )) вместо else

И затем используйте его как:

$ ceildiv 10 3
4
$ ceildiv 501 500
2
$ ceildiv 0 3
0
$ ceildiv -10 1
-10
$ ceildiv -10 3
-4

Ответ 8

Математически функцию потолка можно определить с помощью пола, потолка (x) = -floor (-x). И пол по умолчанию используется при преобразовании положительного поплавка в целое число.

if [ $N -gt 0 ]; then expr 1 - $(expr $(expr 1 - $N) / 500); else expr $N / 500; fi

Ref. https://en.wikipedia.org/wiki/Floor_and_ceiling_functions

Ответ 9

Это простое решение с использованием Awk:

Если вы хотите, чтобы ceil ($ a/$b) использовал

echo "$a $b" | awk '{print int( ($1/$2) + 1 )}'

и использование пола

echo "$a $b" | awk '{print int($1/$2)}'

Обратите внимание, что я просто повторяю дивиденд '$ a' как первое поле строки awk и делитель '$ b' как второй.

Ответ 10

Еще одна краткая логика Awk

awk '
function ceil(ip) {
  print ip%1 ? int(ip)+1 : ip
}  
BEGIN {
  ceil(1000/500)
  ceil(1001/500)
}
'

Результат

2
3

Ответ 11

Эта функция не добавит 1, если деление возвращает неплавающее число.

function ceiling {
    DIVIDEND=${1}
    DIVISOR=${2}
    if [ $(( DIVIDEND % DIVISOR )) -gt 0 ]; then
            RESULT=$(( ( ( $DIVIDEND - ( $DIVIDEND % $DIVISOR ) ) / $DIVISOR ) + 1 ))
    else
            RESULT=$(( $DIVIDEND / $DIVISOR ))
    fi
    echo $RESULT
}

Используйте его следующим образом:

echo $( ceiling 100 33 )
> 4