Да, вам следует пройти тест [[$ ((i% 2)) -eq 0 && $ ((i% 3)) -экв 0 ... ...]]
.
Он проверит, делится ли число $ i
на все числа в списке, одновременно .
Но что вы делаете, если число соответствует этому тесту?
Распечатайте его, потому что вы нашли число?
Нет, вы увеличиваете его, вам нужно чтобы отменить действие, другими словами:
Увеличить
$ i
, если тест не пройден.
Либо выполните:
while ! [[ … . … ]]; do
Или:
until [[ … . … ]]; do
Это займет ужасное количество времени, чтобы найти 9699690 (число, которое вы ищете с помощью своего кода, что также не является правильным ответом).
Правильный способ найти это впереди, продолжайте читать.
Но почему вы не включаете, например, 4, 6 или 9 и т. Д.
Потому что они не простые? Позвольте мне пояснить на примере идеи.
Число 9699690 делится на все простые числа (2 3 5 7 9 11 13 17 19) в вашем тесте, но не делится на 4
.
Написанный вами код не работает. И требуется очень много времени, чтобы найти ответ методом грубой силы (перебирая каждое из целых чисел, пока не будет найдено правильное, особенно в оболочке, которая является одним из самых медленных языков).
Но проблема могла бы быть проще, если бы мы описали ее, сказав:
найти НОК списка {1..20}.
Это L восток C ommon M краткое из нескольких чисел.
НОК: НОК (а, б) = (a * b) / gcd (a, b)
(математическое уравнение).
Где gcd id G reatest C ommon D ivisor.
И Евклид (около 2300 лет назад) описал первое.
Алгоритм Евклида - эффективный метод вычисления наибольшего общего делителя (НОД) двух чисел
Страница алгоритма Евклида
Алгоритм Евклида в коде оболочки Unix
Наименьшее общее кратное: загадка
Реализация в современных оболочках как функции довольно проста:
gcd() { # Calculate $1 % $2 until $2 becomes zero.
until [ "$2" -eq 0 ]; do set -- "$2" "$(($1%$2))"; done
echo "$1"
}
И тогда код lcm также прост:
lcm() { echo "$(( $1 / $(gcd "$1" "$2") * $2 ))"; }
Что необходимо, так это перебрать все заданные аргументы, пока не останется только один:
while [ $# -gt 1 ]
do
t="$(lcm "$1" "$2")"
shift 2
set -- "$t" "$@"
done
echo "$1"
Вызов всего Программа с числами, которые вы использовали, дает номер, который я использовал выше:
$ ./script 2 3 5 7 11 13 17 19
9699690
Вы можете вызвать сценарий как:
$ ./script {2..20}
Чтобы получить окончательный ответ.
Альтернативное решение с awk
$ seq 3 > first.xls
$ seq 4 6 > second.xls
$ awk -v OFS="\t" 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0 > "first.xls"}' first.xls second.xls
$ cat first.xls
1 4
2 5
3 6
$ awk -v OFS="\t" 'NR==FNR{a[NR]=$0; next} {print a[FNR], $0 > "first.xls"}' first.xls second.xls
$ cat first.xls
1 4 4
2 5 5
3 6 6