■ 分数100桁小数表現
まず、広瀬さんがBasicでそのアルゴリズムを示してくれました。

1.Basic
-------------------------------------
   10   dim Q(20)
   20   input "a=";A
   30   input "b=";B
   40   for I=0 to 20
   50   Q(I)=int(A/B)
   60   R=A-Q(I)*B
   70   A=R*100000
   80   next I
   90   for J=0 to 20
  100   print Q(J)
  120   next J
  130   end
------------------------------------
5桁ずつまとめてるのがすごいです。
UBasicなら1行で書けるそうです。
 

私は、まずCで挑戦してみました。

2 C
------------------------------------
#include <stdio.h>

int a,b,r,i,q[20];

int main(void)
{
a=1;
while(a!=0){
 printf("a=");
 scanf("%d",&a);
 printf("b=");
 scanf("%d",&b);

 for (i=0;i<=20;i++){
   q[i]=a/b;
   r=a-q[i]*b;
   a=r*100000;

 }
  printf("%d.",q[0]);
  for (i=1;i<=20;i++){
  printf("%d",q[i]);
  }
  printf("\n");
}
}
----------------------------------
結構長いです。

次は、広瀬さんがLogo坊で書いてくれました。
Logo坊 は 兼宗さんによるLogoです。MS Windws 用とMSDOS用があります。

3. LogoB
--------------------------------------------------------------------
手順は 分数小数
        絵を元へ
        (書け ”分数を小数にする。 "10 "/ "7 "の形で入力。)
        変数は "X 読んだリスト
        変数は "A (最初 :X) 
        変数は "B (最後 :X)
                続けて書け 整数 (:A / :B)
                続けて書け ".
                変数は "R (余り :A :B)
                変数は "A (:R * 100000)
        繰り返せ 100「
                続けて書け 整数 (:A / :B)
                変数は "R (余り :A :B)
                変数は "A (:R * 100000)
                」
        書け ”
終り
-------------------------------------------------------------------

次は広瀬さんによる、Visual Basic版(MSWindows用)です。

4.VB
--------------------------------

Private Sub Command1_Click()
    a = Text1.Text
    pos = InStr(a, "/")
    p = Mid(a, 1, pos - 1)
    q = Mid(a, pos + 1)
        Print p \ q; "."
        p = (p Mod q) * 100000
    For i = 1 To 100
        Print p \ q
        p = (p Mod q) * 100000
    Next i
End Sub

Private Sub Command2_Click()
    End
End Sub

-------------------------------

次は私がLinux でPerl でやってみました。
コマンドライン引数を利用してます。

5.Perl

-------------------------------
#!/usr/bin/perl

$a=$ARGV[0];
$b=$ARGV[1];
 

for ($i = 0;$i <= 20;$i++){
    $q[$i]=int($a / $b);
    $r=$a - $q[$i]*$b;
    $a=$r*100000;
}
 

print "$q[0].";
for ($i = 1;$i <= 20;$i++){
    print "$q[$i]";
}
print "\n";
-------------------------------

Tclでもやってみました。

6. tcl
---------------------------------------
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"

set a [lindex $argv 0]
set b [lindex $argv 1]

for {set i 0} {$i <= 20} {incr i} {
set q($i) [expr $a / $b]
set r [expr $a - $q($i)*$b]
set a [expr $r*100000]
}

puts -nonewline $q(0)
set dot .
puts -nonewline $dot

for {set i 1} {$i <= 19} {incr i} {
puts -nonewline $q($i)
}
puts $q(20)
exit
-------------------------------------

まつもとさんと言う方が作られた、オブジェクト指向
スクリプト言語Rubyでやってみました。

7.Ruby
-------------------------------------
#!/usr/local/bin/ruby

q = Array.new(0)
a=1
while a!=0
   print "a="
   a=readline().to_i

if a!=0
      print "b="
      b=readline().to_i

  for i in 0..20
    q[i]=a / b
    r=a-q[i]*b
    a=r*100000
  end

  print q[0],"."
  for i in 1..20
    print q[i]
  end
  print "\n"

end
  print "\n"
end

-----------------------------------
Rubyって、初心者にも本当に馴染みやすいです。
 
 

8.Lisp

次は、高橋さんによる Emacs Lisp版です。

(1) 再帰による方法
---------------------------------------------------------------------------
(defun bunsu (a b n)
   (setq sho (int-to-string (/ a b)))
   (setq amari (* (mod a b) 100000))
   (cond  ((equal n 0)  (bunsu amari b (+ n 1)))
          ((<  n  20) (concat  sho (bunsu amari b (+ n 1))))
          ((=  n  20) nil)))
 この文末で、C-x,C-eとして、関数 bunsu をインストール。
 (bunsu 22 7 0)の文末でC-x,C-eとして評価すると、結果が下に出ます。

(2) whileを使った繰り返し
---------------------------------------------------------------------------
(defun bunsu3  (a b)
 ; (interactive "P")
   (setq a (* (mod a b) 100000))
   (setq ans ())
   (setq n  0)
  (while (< n 21)
    (setq sho (int-to-string (/ a b)))
    (setq ans (concat ans sho))
    (setq a (* (mod a  b) 100000))
     (setq n  (1+ n)))
   (message "Ans = %s"  ans))

---------------------------------------------------------------------------