The OpenNET Project / Index page

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



Индекс форумов
Составление сообщения

Исходное сообщение
"_периодическая дробная при делениИ"
Отправлено Andrey Mitrofanov, 27-Июл-12 12:52 
>> нужно посчитать (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]

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



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

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