>> нужно посчитать (a-b)/c, чтобы дробная часть осталась.
> Ура, зачёты и курсовые начались... Будем разминать моск!!! :D
> Вспоминаем школу - деление столбиком. :)
> #!/bin/bash
> m=();
> Разминаем. Вот т-те твои "трансцедентные".
- - - 8< - - - ./b.sh#!/bin/bashdiv() {
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]