вставить и сохранить результат в первый аргумент без использования временных файлов

Да, вам следует пройти тест [[$ ((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 .

Написанный вами код не работает. И требуется очень много времени, чтобы найти ответ методом грубой силы (перебирая каждое из целых чисел, пока не будет найдено правильное, особенно в оболочке, которая является одним из самых медленных языков).


L.C.M.

Но проблема могла бы быть проще, если бы мы описали ее, сказав:

найти НОК списка {1..20}.

Это L восток C ommon M краткое из нескольких чисел. НОК: НОК (а, б) = (a * b) / gcd (a, b) (математическое уравнение).

G.C.D.

Где 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}

Чтобы получить окончательный ответ.

2
08.11.2016, 16:14
1 ответ

Альтернативное решение с 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
0
27.01.2020, 22:10

Теги

Похожие вопросы