The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
дробная часть при деление, !*! nastr, 24-Май-12, 17:53  [смотреть все]
есть 3 переменные в shell, например:
a=4000000;b=2634523;c=12532;
нужно посчитать (a-b)/c, чтобы дробная часть осталась.
следующие 2 варианта не катят, т.к. отбрасывается дробная часть
expr ( $ a - $b ) / $c
let d=a-b;let e=d/c
  • дробная часть при деление, !*! Andrey Mitrofanov, 18:18 , 24-Май-12 (1)
    > нужно посчитать (a-b)/c, чтобы дробная часть осталась.
    > следующие 2 варианта не катят, т.к. отбрасывается дробная часть

    Штаны на лямках, т.м.!

    $ expr \( $a - $b \) \* 100 / $c |sed 's/..$/.&/'
    108.95
    $ _

    • дробная часть при деление, !*! nastr, 18:44 , 24-Май-12 (2)
      freepercen=`expr 100 - \( \( ${lcresource[1]}  \* 100 \) / ${lcresource[0]} \) |sed 's/..$/.&/'`
      sesperuser=`expr \( ${lcresource[0]} - ${lcresource[1]} \) / $lcpersist |sed 's/..$/.&/'`

      к первой переменной добавляет точку вначале, получается .34%,
      а во второй переменной вставляет точку после перво

    • дробная часть при деление, !*! nastr, 18:45 , 24-Май-12 (3)
      freepercen=`expr 100 - \( \( ${lcresource[1]}  \* 100 \) / ${lcresource[0]} \) |sed 's/..$/.&/'`
      sesperuser=`expr \( ${lcresource[0]} - ${lcresource[1]} \) / $lcpersist |sed 's/..$/.&/'`

      к первой переменной добавляет точку вначале, получается .34%,
      а во второй переменной вставляет точку после первой цифры, полается 1.11, а должно 111.95

  • дробная часть при деление, !*! allez, 19:43 , 24-Май-12 (4)
    > есть 3 переменные в shell, например:
    > a=4000000;b=2634523;c=12532;
    > нужно посчитать (a-b)/c, чтобы дробная часть осталась.
    > следующие 2 варианта не катят, т.к. отбрасывается дробная часть
    > expr ( $ a - $b ) / $c
    > let d=a-b;let e=d/c

    Использование bc допускается?

    $ a=4000000; b=2634523; c=12532; echo "($a-$b)/$c" | bc -l
    108.95922438557293329077

  • дробная часть при деление, !*! pavlinux, 19:46 , 30-Май-12 (9) +1
    > нужно посчитать (a-b)/c, чтобы дробная часть осталась.

    Ура, зачёты и курсовые начались... Будем разминать моск!!! :D

    Вспоминаем школу - деление столбиком. :)


    #!/bin/bash

    a=4000000;
    b=2634523;
    c=12532;
    m=();

    x=$((a-b));
    s=$((x/c));
    h=$((x-(c*s)));

    if [ $h == 0 ];
       then
           echo "$s.0";
           exit;
    fi;

    p=100;

    for ((i = 0; i < p; i++))
       do
            h=$((h * 10));
           ss=$((h / c));
            h=$((h - c * ss));

            m[$i]=$ss;

    done;

    echo -ne "$s.";

    for (( i = 0; i < ${#m[*]}; i++ ))
       do
          echo -ne "${m[$i]}";
    done;

    echo;

    $ a.sh
    108.9592243855729332907756144270667092243855729332907756144270667092243855729332907756144270667092243855

    • дробная часть при деление, !*! pavlinux, 22:46 , 30-Май-12 (11) +1
      > Вспоминаем школу - деление столбиком. :)
      >108.9592243855729332907756144270667092243855729332907756144270667092243855729332907756144270667092243855

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

      Сие число является трансцендентным, но переводческим: 108.95(922438557293329077561442706670)

      1. Найти этот период на bash
      2. Представить в виде рациональной дроби.

      P.S. Сравнение строк и символов не юзать, только чистый матан!

      P.P.S. На сервере ничего нет, установлен только bash :)

      • дробная часть при деление, !*! Andrey Mitrofanov, 10:03 , 31-Май-12 (13)
        >> Вспоминаем школу - деление столбиком. :)
        >>108.9592243855729332907756144270667092243855729332907756144270667092243855729332907756144270667092243855

        Силён, да!:)

        > Дополнительная задачка на лето :)
        > Сие число является трансцендентным, но переводческим: 108.95(922438557293329077561442706670)

        Ты, конечно, задирал студента, и там д.б.быть "ра...ным" и "пери..кой десятичной ...". В общем да, так их.

      • дробная часть при деление, !*! LSTemp, 23:17 , 29-Июн-12 (16)
        >> Вспоминаем школу - деление столбиком. :)
        >>108.9592243855729332907756144270667092243855729332907756144270667092243855729332907756144270667092243855
        > Дополнительная задачка на лето :)
        > Сие число является трансцендентным, но переводческим: 108.95(922438557293329077561442706670)
        > 1. Найти этот период на bash
        > 2. Представить в виде рациональной дроби.
        > P.S. Сравнение строк и символов не юзать, только чистый матан!
        > P.P.S. На сервере ничего нет, установлен только bash :)

        1) Спасибо за интересный вопрос. Профукал ссылку на эту тему в свое время на него, однако Аноним (спасибо) помог снова найти ее. Убил даже пару часов, чтоб институтскую математику вспомнить (азы только, за что еще раз спасибо:)

        2) bash работает только с целочисленными значениями, чистый матан не выйдет в любом случае - для выделения дробной части числа все равно придется пользоваться строковым опрерациями (хотя и не совсем теми, что Вы явно запретили) что-то вроде:

        # 108.95(922438557293329077561442706670)
        v='108.95922438557293329077561442706670922438557293329077561442706670922438557293329077561442706670922438557293329077561442706670'
        f="${v##*.}"

        3) Разве понятие "трансцендентное число" не означает, что это число имеет бесконечный НЕПОВТОРЯЮЩИЙСЯ ряд цифр, что идет в разрез с другим условием задачи - "число является периодическим"?

        ИМХО некорректная постановка задачи. Если будет время, прокомментируйте мои соображения. Интересно.

        PS
        Спасибо (даже если ответ не верен), что сподвигнули меня немного математику вспомнить )

        • дробная часть при деление, !*! pavlinux, 15:55 , 30-Июн-12 (17) +1
          > 3) Разве понятие "трансцендентное число" не означает, что это число имеет бесконечный
          > НЕПОВТОРЯЮЩИЙСЯ ряд цифр, что идет в разрез с другим условием задачи
          > - "число является периодическим"?

          Ну да, фигню сморозил, я имел в виду бесконечным.  

          • дробная часть при деление, !*! LSTemp, 04:30 , 03-Июл-12 (18)
            >> 3) Разве понятие "трансцендентное число" не означает, что это число имеет бесконечный
            >> НЕПОВТОРЯЮЩИЙСЯ ряд цифр, что идет в разрез с другим условием задачи
            >> - "число является периодическим"?
            > Ну да, фигню сморозил, я имел в виду бесконечным.

            ладно. кажется я иронию понял и вики даже почитал ).

            - Каждое трансцендентное вещественное число является иррациональным
            http://ru.wikipedia.org/wiki/%D0%A2%D1%8...

            - Иррациональное число: Представляет собой бесконечную непериодическую десятичную дробь.
            http://ru.wikipedia.org/wiki/%D0%98%D1%8...

            я дал ответ - задача нерешаема в предложенных условиях.

            вопрос решен или нет? жду ответа преподавателя ).

            PS
            https://www.opennet.ru/openforum/vsluhforumID9/9492.html#30


            • дробная часть при деление, !*! LSTemp, 20:59 , 05-Июл-12 (19)
              > вопрос решен или нет? жду ответа преподавателя ).

              или корректировки вопроса.

              • дробная часть при деление, !*! pavlinux, 05:55 , 17-Июл-12 (20)
                >> вопрос решен или нет? жду ответа преподавателя ).
                > или корректировки вопроса.

                1. Число рациональное: 108+(12021/12532), но оно не влезет в целый типа баша,
                период 30 знаков, а чтоб определить повтор нужно хотя бы 61.

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

                2. А чтоб сделать из числа с мантисой рациональную дробь,
                достаточно разделить на порядок, найти НОД и упростить дробь.

                напр.

                108.12 == 108+0.12 == 108+(12/100) => НОД(12,100)= 4;
                108.12 == 108+(3/25) => (108*25+3)/25 == 2703/25;

                ---

                • дробная часть при деление, !*! Andrey Mitrofanov, 09:06 , 17-Июл-12 (21) +1
                  >>> вопрос решен или нет? жду ответа преподавателя ).
                  >> или корректировки вопроса.
                  > 1. Число рациональное: 108+(12021/12532), но оно не влезет в целый типа баша,
                  > период 30 знаков, а чтоб определить повтор нужно хотя бы 61.

                  Тссс! Не говори никому. Делимое-дедитель помещаются, и этого достаточно.

                  Запоминаешь для кажого выведенного разряда (цифры) результата пару делимое-делитель. Как только перед выводом очередной цифры результата пара повторилась -- период найден. (Не обязательньно с первой цифры или с первой после запятой. Т.е.может быть "непариодическая" чать в десятичной дроби.)

                  Про НОД - ты уже написал. Можно дробь поупрощать вначале.

                  > Если число не влазит в процессор, его режут по кускам и работают

                  Где bash и где процессор?:)

                  >2. А чтоб сделать из числа с мантисой рациональную дробь,

                  Вещественного с _округлением? Или :))периодической десятичной дроби?

                  • дробная часть при деление, !*! Andrey Mitrofanov, 09:16 , 17-Июл-12 (22)
                    >>но оно не влезет в целый типа баша,
                    >> период 30 знаков, а чтоб определить повтор
                    >Делимое-дедитель помещаются, и этого достаточно.

                    Точнее, делимое <= делитель <= MAXINT/10. После чего, видимо, начинается мультиворд арифметик.

                  • дробная часть при деление, !*! pavlinux, 00:33 , 18-Июл-12 (23) +1
                    >>>> вопрос решен или нет? жду ответа преподавателя ).
                    >>> или корректировки вопроса.
                    >> 1. Число рациональное: 108+(12021/12532), но оно не влезет в целый типа баша,
                    >> период 30 знаков, а чтоб определить повтор нужно хотя бы 61.
                    > Тссс! Не говори никому. Делимое-дедитель помещаются, и этого достаточно.

                    108+(12021/12532) - эта дробь и в мозг влезет.

                    А я про это число, его только в матрицу и по кускам - домножил, сравнил, запомнил, следующий,...

                    108.95922438557293329077561442706670922438557293329077561442706670922438557293329077561442706670922438557293329077561442706670

                    > Про НОД - ты уже написал. Можно дробь поупрощать вначале.

                    НОД это и есть, то число на которое можно максимальное упростить дробь. :)

                    > Вещественного с _округлением? Или :))периодической десятичной дроби?

                    В том виде в котором его вводят.  Есть машинная эпсилон - 304 степень, больше ну никак.
                    для остального придумали libgmp

                    ----

                    Так что задача сводится к трём функциям: Работа с большими числами, Нахождение порядка мантиссы, Нахождение НОД,
                    ну и мелочь всякя, типа упрощение дроби, умножение матриц... в общем уже пошли подсказки.    

                    • дробная часть при деление, !*! pavlinux, 00:38 , 18-Июл-12 (24)
                    • дробная часть при деление, !*! LSTemp, 05:20 , 18-Июл-12 (30)
                      >>>>> вопрос решен или нет? жду ответа преподавателя ).
                      >>>> или корректировки вопроса.
                      >>> 1. Число рациональное: 108+(12021/12532), но оно не влезет в целый типа баша,
                      >>> период 30 знаков, а чтоб определить повтор нужно хотя бы 61.
                      >> Тссс! Не говори никому. Делимое-дедитель помещаются, и этого достаточно.
                      > 108+(12021/12532) - эта дробь и в мозг влезет.
                      > А я про это число, его только в матрицу и по кускам
                      > - домножил, сравнил, запомнил, следующий,...

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

                      >[оверквотинг удален]
                      > :)
                      >> Вещественного с _округлением? Или :))периодической десятичной дроби?
                      > В том виде в котором его вводят.  Есть машинная эпсилон -
                      > 304 степень, больше ну никак.
                      > для остального придумали libgmp
                      > ----
                      > Так что задача сводится к трём функциям: Работа с большими числами, Нахождение
                      > порядка мантиссы, Нахождение НОД,
                      > ну и мелочь всякя, типа упрощение дроби, умножение матриц... в общем уже
                      > пошли подсказки.

                    • дробная часть при деление, !*! Andrey Mitrofanov, 18:33 , 18-Июл-12 (31)
                      Внимательно повторяю:

                      >> Тссс! Не говори никому. Делимое-дедитель помещаются, и этого достаточно.

                      #>> делимое <= делитель <= MAXINT/10

                      > 108+(12021/12532) - эта дробь и в мозг влезет.
                      > А я про это число, его только в матрицу и по кускам
                      > - домножил, сравнил, запомнил, следующий,...

                      Нет.(С)

                      > 108.95922438557293329077561442706670922438557293329077561442706670922438557293329077561442706670922438557293329077561442706670

                      $ ./b.sh |less
                      1365477 / 12532 = 108.95(922438557293329077561442706670)
                      1 / 40 = 0.025
                      1 / 20 = 0.05
                      1 / 2 = 0.5
                      1 / 1 = 1
                      1 / 3 = 0.(3)
                      1 / 30 = 0.0(3)
                      1 / 300 = 0.00(3)
                      1 / 7 = 0.(142857)
                      1 / 70 = 0.0(142857)
                      1 / 700 = 0.00(142857)
                      1 / 7 = 0.(142857)
                      3 / 7 = 0.(428571)
                      2 / 7 = 0.(285714)
                      6 / 7 = 0.(857142)
                      4 / 7 = 0.(571428)
                      5 / 7 = 0.(714285)
                      1 / 9 = 0.(1)
                      1 / 90 = 0.0(1)
                      (END)

                      >> Вещественного с _округлением? Или :))периодической десятичной дроби?
                      > В том виде в котором его вводят.  Есть машинная эпсилон -
                      > 304 степень, больше ну никак.
                      > для остального придумали libgmp

                      Задание на лето#2: из колонки после " = " получать то, что "до".
                      Напр.: 0.00(142857) >>> 1 /700

                      //Да, наверное, можно... Подсказка и ./b.sh -- в следующих выпусках. Stay tuned///

                • дробная часть при деление, !*! LSTemp, 02:55 , 18-Июл-12 (25)
                  >>> вопрос решен или нет? жду ответа преподавателя ).
                  >> или корректировки вопроса.

                  СТОП!!! )))

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

                  Я хочу получить ответ, на свой ответ (тавтология - знаю). Изначально Ваша задача содержит противоречивые и взаимоисключающие математические термины (гениев в расчет не берем - они как раз для решения таких противоречий :). Решения Вашей задачи в предоставленных Вами условиях не существует.

                  Признаете?

                  Корректировки вопроса я не видел, вижу решение, которое мне пытаются показать, рассказывая очевидные вещи (в байте 8-бит итд - утрирую конечно - но суть такая же)

                  ADD
                  браузер подгюлчил (он у меня старенький) - теперь увидел тему, что сейчас число якобы стало иррациональным. увидел Ваш подход и некоторые решения. Математически - да. Практически, раз друге услови задачи не изменились - все равно  - не решаемо (вернее решаемо, но напрямую связано с неадекватным гемороем битвы за этот результат в оставшихся ограничивающих условиях)


                  • дробная часть при деление, !*! pavlinux, 05:43 , 19-Июл-12 (32)
                    >[оверквотинг удален]
                    >>> или корректировки вопроса.
                    > СТОП!!! )))
                    > Вопрос от Вас был задан (дополнительная задача на лето). И мне кажется
                    > я свой ответ довольно развернуто объяснил (дважды). То, что Вы подразумевали
                    > в конечном результате, роли не играет.
                    > Я хочу получить ответ, на свой ответ (тавтология - знаю). Изначально Ваша
                    > задача содержит противоречивые и взаимоисключающие математические термины (гениев в расчет
                    > не берем - они как раз для решения таких противоречий :).
                    > Решения Вашей задачи в предоставленных Вами условиях не существует.
                    > Признаете?

                    Вопроса было два:

                    1. Из того длинного числа с мантиссой найдти и показать период.
                    2. Вернуть дробь обратно.  float -> int/int

                    Число можешь представлять как хочешь, - массив, строка, два числа, число и массив,...

                    Строгих два правила: Для вычислений НЕ юзать внешние утилиты и НЕ использовать строковое сравнение.  


                    • дробная часть при деление, !*! LSTemp, 23:20 , 21-Июл-12 (34)
                      >[оверквотинг удален]
                      >> Я хочу получить ответ, на свой ответ (тавтология - знаю). Изначально Ваша
                      >> задача содержит противоречивые и взаимоисключающие математические термины (гениев в расчет
                      >> не берем - они как раз для решения таких противоречий :).
                      >> Решения Вашей задачи в предоставленных Вами условиях не существует.
                      >> Признаете?
                      > Вопроса было два:
                      > 1. Из того длинного числа с мантиссой найдти и показать период.
                      > 2. Вернуть дробь обратно.  float -> int/int
                      > Число можешь представлять как хочешь, - массив, строка, два числа, число и
                      > массив,...

                      Эти условия ясны. Одно но (цитирую Вас - первоначальная постановка задачи):
                      "
                      Дополнительная задачка на лето :)

                      Сие число является трансцендентным, но переводческим: 108.95(922438557293329077561442706670)
                      "

                      Трансцендентное и периодическое число являются взаимоисключающими математическими понятиями. Поэтому в этих условиях задача не решаема (я не знаю откуда Вы взяли число и почему описали его, как трансцендентное, указав при этом период. я вижу то, что вижу). Подтвердите это или скажите, что я не прав (я это уже раза 3-и спрашивал - ответа нет).

                      > Строгих два правила: Для вычислений НЕ юзать внешние утилиты и НЕ использовать
                      > строковое сравнение.

                      Условия решения задачи понятны. Ее формулировка не ясна для меня до сих пор (я честно уже немного запутался в постах) - можно повторить специально для меня (заранее спасибо) :).


                • дробная часть при деление, !*! LSTemp, 03:29 , 18-Июл-12 (26)
                  >[оверквотинг удален]
                  > период 30 знаков, а чтоб определить повтор нужно хотя бы 61.
                  > Если число не влазит в процессор, его режут по кускам и работают
                  > либо нудными циклическими алгоритмами со сдвигами, либо матричные
                  > преобразования. Если честно, ужасно лень :)
                  > 2. А чтоб сделать из числа с мантисой рациональную дробь,
                  > достаточно разделить на порядок, найти НОД и упростить дробь.
                  > напр.
                  > 108.12 == 108+0.12 == 108+(12/100) => НОД(12,100)= 4;
                  > 108.12 == 108+(3/25) => (108*25+3)/25 == 2703/25;
                  > ---

                  v=108.12
                  i=0
                  f=0

                  продемонстрируйте плз на bash выделение целой(i) и дробной(f) части из заданного значения(v) без использования строковых функций. на сервер ничего нет - только bash.


                  • дробная часть при деление, !*! LSTemp, 04:39 , 18-Июл-12 (28)
                    >[оверквотинг удален]
                    >> достаточно разделить на порядок, найти НОД и упростить дробь.
                    >> напр.
                    >> 108.12 == 108+0.12 == 108+(12/100) => НОД(12,100)= 4;
                    >> 108.12 == 108+(3/25) => (108*25+3)/25 == 2703/25;
                    >> ---
                    > v=108.12
                    > i=0
                    > f=0
                    > продемонстрируйте плз на bash выделение целой(i) и дробной(f) части из заданного значения(v)
                    > без использования строковых функций. на сервер ничего нет - только bash.

                    снимаю вопрос - начальное ограничение было только СРАВНЕНИЕ строк не использовать.


                • дробная часть при деление, !*! LSTemp, 04:02 , 18-Июл-12 (27)
                  >[оверквотинг удален]
                  > период 30 знаков, а чтоб определить повтор нужно хотя бы 61.
                  > Если число не влазит в процессор, его режут по кускам и работают
                  > либо нудными циклическими алгоритмами со сдвигами, либо матричные
                  > преобразования. Если честно, ужасно лень :)
                  > 2. А чтоб сделать из числа с мантисой рациональную дробь,
                  > достаточно разделить на порядок, найти НОД и упростить дробь.
                  > напр.
                  > 108.12 == 108+0.12 == 108+(12/100) => НОД(12,100)= 4;
                  > 108.12 == 108+(3/25) => (108*25+3)/25 == 2703/25;
                  > ---

                  30-Июн-12, 01:09: "- к решению второго пункта задачи при реальных реальных условиях я бы подошел с того, что степени 10 в знаменатель ставил для начала (для простоты)."

                  https://www.opennet.ru/openforum/vsluhforumID9/9492.html#30

                  про интегралы на bash  я конечно пошутил - решение задачи того не стоит.

                  • дробная часть при деление, !*! pavlinux, 05:50 , 19-Июл-12 (33)
                    > про интегралы на bash  я конечно пошутил - решение задачи того не стоит.

                    Определённые - методом прямоугольников, неопределённые - по частям методом прямоугольников. :)


                    • дробная часть при деление, !*! LSTemp, 23:26 , 21-Июл-12 (35)
                      >> про интегралы на bash  я конечно пошутил - решение задачи того не стоит.
                      > Определённые - методом прямоугольников, неопределённые - по частям методом прямоугольников.
                      > :)

                      Спасибо.

                      Но я вообще-то об эффективности решения говорил. Можно и на ассемблере - все от задачи зависит (про Вашу я уже спрашивал - реальная/не_реальная/обучение/что-то еще?)


                      • дробная часть при деление, !*! pavlinux, 04:14 , 22-Июл-12 (36)
                        > реальная/не_реальная/обучение/что-то еще?)

                        Just for fun!!!

                        Тут шастуют преподы универов, тырят отседа примеры задач для студентов.
                        Можно гадость с подставой для обоих сделать. За одно и преподов обучим. :)  

                        Например мало кто юзает popd/push, -, shift, local, declare...


                        А ваще, как месть JavaScript хоцца написать MP3 плеер. :)

                        • дробная часть при деление, !*! LSTemp, 01:57 , 23-Июл-12 (37)
                          >> реальная/не_реальная/обучение/что-то еще?)
                          > Just for fun!!!
                          > Тут шастуют преподы универов, тырят отседа примеры задач для студентов.
                          > Можно гадость с подставой для обоих сделать. За одно и преподов обучим.
                          > :)
                          > Например мало кто юзает popd/push, -, shift, local, declare...
                          > А ваще, как месть JavaScript хоцца написать MP3 плеер. :)

                          ))))))))) повеселило ) - одобрямс )


                • дробная часть при деление, !*! LSTemp, 04:56 , 18-Июл-12 (29)
                  >>> вопрос решен или нет? жду ответа преподавателя ).
                  >> или корректировки вопроса.
                  > 1. Число рациональное: 108+(12021/12532), но оно не влезет в целый типа баша,
                  > период 30 знаков, а чтоб определить повтор нужно хотя бы 61.
                  > Если число не влазит в процессор, его режут по кускам и работают
                  > либо нудными циклическими алгоритмами со сдвигами, либо матричные
                  > преобразования. Если честно, ужасно лень :)
                  > 2. А чтоб сделать из числа с мантисой рациональную дробь,
                  > достаточно разделить на порядок, найти НОД и упростить дробь.

                  поиск НОД все равно  = цикл

                  > напр.
                  > 108.12 == 108+0.12 == 108+(12/100) => НОД(12,100)= 4;
                  > 108.12 == 108+(3/25) => (108*25+3)/25 == 2703/25;
                  > ---

    • _периодическая дробная при делениИ, !*! Andrey Mitrofanov, 12:52 , 27-Июл-12 (39)
      >> нужно посчитать (a-b)/c, чтобы дробная часть осталась.
      > Ура, зачёты и курсовые начались... Будем разминать моск!!! :D
      > Вспоминаем школу - деление столбиком. :)
      >
      #!/bin/bash 
      > m=();
      >

      Разминаем. Вот т-те твои "трансцедентные".

      - - - 8< - - - ./b.sh

      #!/bin/bash

      div() {

      local x c m s h p h1 i j

      x=$1; c=$2

      m=();
      h1="${c//?/ }"
      s="${h1:${#x}} $x / $c = $((x/c))"
      h=$((x%c))
          [ "$DBG" ] && echo "-- $x. $h $c"

      p=$c #at max.

      i=0; j=0
      while ((h!=0)); do

        let  h1=h  h=h*10  ss=h/c  h=h%c
        let m[i]=ss
        let mm[i]=h1

          [ "$DBG" ] && echo "++$ss j=$j i=$i h1=$h1"

      ((j>=i && i<p)) || break
        let i++

        for((j=0; j<i && mm[j]!=h; j++)); do :; done
      done

           [ "$DBG" ] && echo "   ## j=$j i=$i h=$h h1^$h1"

      ((h==0&&i==0)) ||\
      for (( l = 0; l <= i; l++ )); do
        ((l==0 )) && s="$s."
        ((l==j &&h!=0 )) && s="$s("
        (( (l+10+2*${#c})d == 0 )) && s="$s"$'\n'           #"words" sep.// ~64 chars
            s="$s${m[$l]}"
        ((l==i-1 &&h!=0 )) && s="$s)" && break
      done

      echo "$s"
      }

      #div 1365477 12532
      #div 1 40;div 1 20;div 1 2;div 1 1;
      #div 1 3;div 1 30;div 1 300
      #div 1 7;div 1 70; div 1 700
      #div 1 7;div 3 7;div 2 7; div 6 7; div 4 7; div 5 7
      #div 1 9;div 1 90
      #exit
      [ "$1" -a "$2" ] && time div $1 $2

      - - - >8 - - -

      Замечаешь, как для определения оооочень:) длинного периода достаточно массива (вектора? списка...) целых, каждое из которых не большне _делителя, а арифметика не выходит за пределы (делитель-1)*10. Отсюда и <=MAXINT/10.

      > $ a.sh
      > 108.9592243855729332907756144270667092243[...8<...]

      [I]$ ./b.sh 1365477 12532
      1365477 / 12532 = 108.95(922438557293329077561442706670)

      real    0m0.023s
      user    0m0.020s
      sys     0m0.004s[/I]

      |

      [I]$ seq 1335 1337|xargs -n1 ./b.sh 1
          1 / 1335 = 0.0(00749063670411985018726591760299625468164794)

      real    0m0.034s
      user    0m0.036s
      sys     0m0.000s
          1 / 1336 = 0.000(7485029940119760479041916167664670658682634
      7305389221556886227544910179640718562874251497005988023952095808
      38323353293413173652694610778443113772455089820359281437125)

      real    0m0.269s
      user    0m0.248s
      sys     0m0.020s
          1 / 1337 = 0.(0007479431563201196709050112191473448017950635
      7516828721017202692595362752430815258040388930441286462228870605
      8339566192969334330590875093492894540014958863126402393418100224
      3829468960359012715033657442034405385190725504861630516080777860
      8825729244577412116679132385938668661181750186985789080029917726
      2528047868362004487658937920718025430067314884068810770381451009
      7232610321615557217651458489154824233358264771877337322363500373
      9715781600598354525056095736724008975317875841436050860134629768
      1376215407629020194465220643231114435302916978309648466716529543
      754674644727)

      real    0m2.629s
      user    0m2.528s
      sys     0m0.100s[/I]

      Когда './b.sh 1 31337' чё-т надолго задумался, основная процедура была переписана на awk
      (...8<... : потеряное при этом нарезание на стороки заменено самоцензурой):

      [I]$ seq 1335 1337|xargs -n1 ./c.sh 1                                                                          
          1 / 1335 = 0.0(00749063670411985018726591760299625468164794)

      real    0m0.003s
      user    0m0.000s
      sys     0m0.000s
          1 / 1336 = 0.000(748502994011976047904191616766467065868263473053892215...8<...

      real    0m0.013s
      user    0m0.008s
      sys     0m0.000s
          1 / 1337 = 0.(000747943156320119670905011219147344...8<...16529543754674644727)

      real    0m0.109s
      user    0m0.108s
      sys     0m0.000s

      .

      $ ./c.sh 1 31337
      ...8<...
      real    5m3.147s
      user    5m2.927s
      sys     0m0.028s[/I]

      ##$ ./b.sh 1 31337
      ##...8<...
      Обобвал после :
      $ top |grep b.sh
      ...
      [I] 6789 yya       20   0  6472 3536 1108 R  100  0.1  51:48.86 b.sh[/I]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру