Pecahan Mesir

20

Gambaran:

Dari Wikipedia : Fraksi Mesir adalah jumlah fraksi unit yang berbeda. Artinya, setiap fraksi dalam ekspresi memiliki pembilang yang sama dengan 1 dan penyebut yang merupakan bilangan bulat positif, dan semua penyebut berbeda satu sama lain. Nilai ekspresi tipe ini adalah bilangan rasional positif a / b. Setiap bilangan rasional positif dapat diwakili oleh fraksi Mesir.

Tantangan:

Tulis fungsi terpendek yang akan mengembalikan nilai semua penyebut untuk sekumpulan fraksi satuan terkecil yang berjumlah hingga pecahan tertentu.

Aturan / Kendala:

  • Input akan menjadi dua nilai integer positif.
    • Ini bisa pada STDIN,, argvdipisahkan koma, dibatasi ruang, atau metode lain yang Anda inginkan.
  • Nilai input pertama harus pembilang dan nilai input kedua penyebut.
  • Nilai input pertama harus kurang dari yang kedua.
  • Keluaran mungkin menyertakan nilai yang melebihi batasan memori sistem / bahasa Anda (RAM, MAX_INT, atau apa pun kendala kode / sistem lainnya). Jika ini terjadi, cukup potong hasilnya pada nilai setinggi mungkin dan catat itu entah bagaimana (yaitu ...).
  • Output harus dapat menangani nilai penyebut hingga setidaknya 2.147.483.647 (2 31 -1, ditandatangani 32-bit int).
    • Nilai yang lebih tinggi ( long, dll.) Sangat dapat diterima.
  • Keluaran harus berupa daftar semua nilai penyebut dari sekumpulan pecahan unit terkecil yang ditemukan (atau pecahan itu sendiri, yaitu 1/2).
  • Output harus dipesan naik sesuai dengan nilai penyebut (turun dengan nilai fraksi).
  • Output dapat dibatasi dengan cara apa pun yang Anda inginkan, tetapi harus ada beberapa karakter di antara untuk membedakan satu nilai dari yang berikutnya.
  • Ini kode golf, jadi solusi terpendek menang.

Exmaples:

  • Input 1:

    43, 48

  • Output 1:

    2, 3, 16

  • Input 2:

    8/11

  • Output 2:

    1/2 1/6 1/22 1/66

  • Input 3:

    5 121

  • Output 3:

    33 121 363

Gaffi
sumber
Input / Output 2 seharusnya 8, 11dan 2, 6, 22, 66benar?
mellamokb
2
Saran yang mungkin, untuk menghilangkan ketidakjelasan, adalah untuk meminta sekumpulan pecahan unit terkecil dengan penyebut akhir terkecil. Misalnya, 1/2 1/6 1/22 1/66akan lebih disukai 1/2 1/5 1/37 1/4070untuk input 8/11.
Primo
2
Saya sarankan menambahkan 5/121 = 1/33+1/121+1/363pada kasus uji. Semua program serakah (termasuk program saya) memberikan 5 fraksi untuk itu. Contoh diambil dari Wikipedia .
ugoren
1
@ primo Saya berpikir bahwa jika ada beberapa minimum, maka mana yang dapat ditemukan akan diterima. Jika satu algoritma dapat ditulis dengan karakter lebih sedikit sebagai hasilnya, saya tidak ingin menghalangi solusi itu.
Gaffi
1
Memberi +1 sejak saya benar-benar belajar tentang pecahan Mesir dalam kursus Sejarah Matematika (dan harus berhitung dengan mereka, serta menemukan jumlah fraksional seperti masalah ini.) Tantangan yang bagus dan kreatif.
mbomb007

Jawaban:

6

Lisp umum, 137 karakter

(defun z(n)(labels((i(n s r)(cond((= n 0)r)((< n(/ 1 s))(i n(ceiling(/ 1 n))r))(t(i(- n(/ 1 s))(1+ s)(cons s r))))))(reverse(i n 2'()))))

(z 43/48) -> (2 3 16)

(z 8/11) -> (2 5 37 4070)

(z 5/121) -> (25 757 763309 873960180913 1527612795642093418846225)

Tidak perlu khawatir tentang jumlah besar, atau menangani notasi fraksional!

Paul Richter
sumber
(defun z (n) (label ((i (nsr) (cond ((= n 0) r)) ((<n (/ 1 dt)) (di (plafon (/ 1 n)) r)) (t ( i (- n (/ 1 s)) (1+ s) (cons sr)))))) (mundur (dalam 2 '())))) (z 43/48) Tampilkan tidak menghasilkan ... Apa yang harus saya gunakan untuk mencetak hasilnya?
RosLuP
1
(cetak (z 103/333)) mengembalikan satu daftar 5 angka tetapi akan ada satu daftar 4 angka sebagai: 1 / 4,1 / 18,1 / 333,1 / 1332. Jadi fungsi di atas tidak akan mengembalikan minimum.
RosLuP
8

Python 2, 169 167 karakter

x,y=input()
def R(n,a,b):
 if n<2:return[b/a][b%a:]
 for m in range((b+a-1)/a,b*n/a):
  L=R(n-1,a*m-b,m*b)
  if L:return[m]+L
n=L=0
while not L:n+=1;L=R(n,x,y)
print L

Mengambil args yang dipisahkan koma pada stdin dan mencetak daftar python di stdout.

$ echo 8,11 | ./egypt.py 
[2, 5, 37, 4070]
Keith Randall
sumber
2
1. Saya pikir Anda dapat menyimpan dua karakter dengan menggunakan tab pada tingkat lekukan kedua. 2. Skrip tidak menunjukkan pemotongan karena melebihi batasan memori sistem.
kotak roti
Di Tio, kode Anda kehabisan memori hanya untuk 103/45533
RosLuP
Alih-alih di Ideone kode Anda berjalan dalam galat run time untuk input yang sama 103.45533: Kesalahan runtime #stdin #stdout #stderr 0.89s 99264KB
RosLuP
4

PHP 82 byte

<?for(fscanf(STDIN,"%d%d",$a,$b);$a;)++$i<$b/$a||printf("$i ",$a=$a*$i-$b,$b*=$i);

Ini bisa dibuat lebih pendek, tetapi pembilang dan penyebut saat ini harus dijaga sebagai bilangan bulat untuk menghindari kesalahan pembulatan titik mengambang (alih-alih menjaga fraksi saat ini).

Penggunaan sampel:

$ echo 43 48 | php egyptian-fraction.php
2 3 16
$ echo 8 11 | php egyptian-fraction.php
2 5 37 4070
primo
sumber
Operator koma ditiru sebagai argumen tidak berguna untuk printf? Saya harus menyimpan trik ini di suatu tempat.
Konrad Borowski
1
Saya cukup yakin ini adalah Algoritma Greedy , jadi tidak akan selalu memberikan pecahan terkecil. Jika Anda menjalankannya dengan input seperti 5 121atau 31 311, itu akan memberikan jawaban yang salah (setelah waktu yang sangat lama).
grc
@grc 31/311 -> {a [1] -> 11, a [2] -> 115, a [3] -> 13570, a [4] -> 46422970}
Dr. belisarius
4

C, 163 177 karakter

6/6 : Akhirnya, program sekarang menangani pemotongan dengan benar dalam semua kasus. Butuh lebih banyak karakter daripada yang saya harapkan, tetapi itu sepadan. Program harus 100% mematuhi persyaratan masalah sekarang.

d[99],c,z;
r(p,q,n,i){for(c=n+q%p<2,i=q/p;c?d[c++]=i,0:++i<n*q/p;)q>~0U/2/i?c=2:r(i*p-q,i*q,n-1);}
main(a,b){for(scanf("%d%d",&a,&b);!c;r(a,b,++z));while(--c)printf("%d\n",d[c]);}

Program mengambil pembilang dan penyebut pada input standar. Penyebut dicetak ke output standar, satu per baris. Output terpotong ditandai dengan mencetak nol penyebut di akhir daftar:

$ ./a.out
2020 2064
2
3
7
402
242004

$ ./a.out
6745 7604
2
3
19
937
1007747
0

Penyebut dalam contoh kedua berjumlah 95485142815/107645519046, yang berbeda dari 6745/7604 dengan kira-kira 1e-14.

kotak roti
sumber
Sekali lagi, saya pikir ini adalah algoritma serakah.
grc
Lingkaran terluar mengeksplorasi semua kemungkinan jawaban dari penyebut N sebelum mulai menguji jawaban penyebut N + 1. Anda bisa menyebutnya serakah, saya kira, tapi saya percaya itu memenuhi masalah yang dinyatakan.
kotak roti
Maaf, saya ambil kembali. Itu tidak mengikuti solusi serakah, tetapi saya telah menemukan bahwa itu tidak sepenuhnya akurat untuk beberapa input ( 31 311misalnya).
grc
31 311meluap, tetapi program gagal menandainya.
kotak roti
3

Python, 61 karakter

Input dari STDIN, dipisahkan koma.
Output ke STDOUT, baris baru dipisahkan.
Tidak selalu mengembalikan representasi terpendek (mis. Untuk 5/121).

a,b=input()
while a:
    i=(b+a-1)/a
    print"1/%d"%i
    a,b=a*i-b,i*b

Karakter dihitung tanpa baris baru yang tidak diperlukan (yaitu, menggabungkan semua garis dalam whilepenggunaan ;).
Fraksi adalah a/b.
iadalah b/adibulatkan, jadi aku tahu 1/i <= a/b.
Setelah mencetak 1/i, saya ganti a/bdengan a/b - 1/i, yaitu (a*i-b)/(i*b).

ugoren
sumber
Saya ingin vote up ini, karena ini sangat kecil, tapi itu hanya hilang yang satu potong!
Gaffi
2
Saya ingin memperbaiki bagian ini, tetapi kemudian tidak akan terlalu kecil ... Saya merasa saya hanya akan menemukan kembali solusi Keith Randall.
ugoren
2

C, 94 byte

n,d,i;main(){scanf("%i%i",&n,&d);for(i=1;n>0&++i>0;){if(n*i>=d)printf("%i ",i),n=n*i-d,d*=i;}}

Cobalah secara Online

sunting: Versi kode yang lebih pendek telah diposting di komentar jadi saya menggantinya. Terima kasih!

う ち わ 密 か
sumber
2
Halo, dan selamat datang di situs ini! Ini adalah kompetisi kode-golf , jadi tujuannya adalah membuat kode Anda sesingkat mungkin . Sepertinya ada banyak hal yang dapat Anda lakukan untuk membuat kode Anda lebih pendek. Misalnya, Anda bisa menghapus semua spasi kosong yang tidak perlu dari jawaban Anda.
DJMcMayhem
@DJMcMayhem Terima kasih, mengerti dan selesai.
う ち わ 密 か
Hai, selamat datang di PPCG! Bisakah Anda menambahkan tautan TryItOnline dengan kode uji untuk kasus uji dalam tantangan? Juga, beberapa hal yang bisa Anda lakukan golf: for(i=2;n>0&&i>0;i++)bisa for(i=1;n>0&++i>0;); kurung for-loop dapat dihapus (karena hanya memiliki bagian ifdalam); d=d*i;bisa d*=i;; dan saya tidak sepenuhnya yakin, tapi saya pikir #include <stdio.h>bisa tanpa spasi: #include<stdio.h>. Oh, dan mungkin menarik untuk membaca Tip untuk bermain golf di C dan Tips untuk bermain golf di <semua bahasa>
Kevin Cruijssen
@KevinCruijssen Terima kasih atas tipsnya.
う ち わ 密 か
94 byte .
Jonathan Frech
1

Stax , 18 byte

é├WüsOΩ↨÷╬6H╒σw[▐â

Jalankan dan debug itu

Pada setiap langkah, ia mencoba untuk meminimalkan pembilang berikutnya . Tampaknya berhasil, tetapi saya tidak dapat membuktikannya.

rekursif
sumber
0

AXIOM, 753 byte

L==>List FRAC INT
macro  M(q)==if c<m or(c=m and m<999 and reduce(max,map(denom,q))<xv)then(m:=c;a:=q;xv:=reduce(max,map(denom,a)))
f(x,n)==(y:=x;a:L:=[];c:=0;q:=denom x;q:=q^4;for i in n.. repeat((c:=c+1)>50=>(a:=[];break);1/i>y=>1;member?(1/i,a)=>1;a:=concat(a,1/i);(y:=y-1/i)=0=>break;numer(y)=1 and ~member?(y,a)=>(a:=concat(a,y);break);(i:=floor(1/y))>q=>(a:=[];break));a)
h(x:FRAC INT):L==(a:L:=[];x>1=>a;numer(x)=1=>[x];n:=max(2,floor(1/x));xv:=m:=999;d:=denom x;zd:=divisors d;z:=copy zd;for i in 2..30 repeat z:=concat(z,i*zd);d:=min(10*d,n+9*m);for i in n..d repeat((c:=maxIndex(b:=f(x,i)))=0=>1;c>m+1=>1;M(b);v:=reduce(+,delete(b,1));for j in z repeat((c:=1+maxIndex(q:=f(v,j)))=1=>1;member?(b.1,q)=>1;q:=concat(b.1,q);M(q)));reverse(sort a))

Idenya akan menerapkan "Greedy Algorithm" dengan poin awal yang berbeda, dan menyimpan daftar yang memiliki panjang minimum. Tetapi tidak selalu akan menemukan solusi min dengan kurang difined: "array A akan kurang dari array B jika dan hanya jika A memiliki beberapa elemen B, atau jika jumlah elemen A sama dengan jumlah elemen B , dari A lebih kecil dari B jika elemen A yang lebih kecil lebih besar daripada angka, daripada elemen B "yang lebih kecil. Tidak disatukan dan diuji

-- this would be the "Greedy Algorithm"
fracR(x,n)==
   y:=x;a:L:=[];c:=0;q:=denom x;q:=q^4
   for i in n.. repeat
      (c:=c+1)>50   =>(a:=[];break)
      1/i>y         =>1
      member?(1/i,a)=>1
      a:=concat(a,1/i)
      (y:=y-1/i)=0  =>break
      numer(y)=1 and ~member?(y,a)=>(a:=concat(a,y);break)
      (i:=floor(1/y))>q           =>(a:=[];break)
   a

-- Return one List a=[1/x1,...,1/xn] with xn PI and x=r/s=reduce(+,a) or return [] for fail
Frazione2SommaReciproci(x:FRAC INT):L==
    a:L:=[]
    x>1       =>a
    numer(x)=1=>[x]
    n:=max(2,floor(1/x));xv:=m:=999;d:=denom x;zd:=divisors d;z:=copy zd
    for i in 2..30 repeat z:=concat(z,i*zd)
    d:=min(10*d,n+9*m) 
    for i in n..d repeat
        (c:=maxIndex(b:=fracR(x,i)))=0=>1 
        c>m+1                         =>1
        M(b)
        v:=reduce(+,delete(b,1))
        for j in z repeat
              (c:=1+maxIndex(q:=fracR(v,j)))=1=>1
              member?(b.1,q)                  =>1
              q:=concat(b.1,q)
              M(q) 
    reverse(sort a)

(7) -> [[i,h(i)] for i in [1/23,2/23,43/48,8/11,5/121,2020/2064,6745/7604,77/79,732/733]]
   (7)
      1   1      2   1  1      43  1 1  1      8  1 1  1  1
   [[--,[--]], [--,[--,---]], [--,[-,-,--]], [--,[-,-,--,--]],
     23  23     23  12 276     48  2 3 16     11  2 6 22 66
      5    1  1   1      505  1 1 1  1    1
    [---,[--,---,---]], [---,[-,-,-,---,----]],
     121  33 121 363     516  2 3 7 602 1204
     6745  1 1  1  1    1      1       77  1 1 1  1  1   1
    [----,[-,-,--,---,-----,------]], [--,[-,-,-,--,---,---]],
     7604  2 3 19 950 72238 570300     79  2 3 8 79 474 632
     732  1 1 1  1   1    1     1
    [---,[-,-,-,--,----,-----,-----]]]
     733  2 3 7 45 7330 20524 26388
                                                      Type: List List Any
       Time: 0.07 (IN) + 200.50 (EV) + 0.03 (OT) + 9.28 (GC) = 209.88 sec
(8) -> h(124547787/123456789456123456)
   (8)
        1             1                         1
   [---------, ---------------, ---------------------------------,
    991247326  140441667310032  613970685539400439432280360548704
                                     1
    -------------------------------------------------------------------]
    3855153765004125533560441957890277453240310786542602992016409976384
                                              Type: List Fraction Integer
                     Time: 17.73 (EV) + 0.02 (OT) + 1.08 (GC) = 18.83 sec
(9) -> h(27538/27539)
         1 1 1  1  1    1      1        1
   (9)  [-,-,-,--,---,-----,------,----------]
         2 3 7 52 225 10332 826170 1100871525
                                              Type: List Fraction Integer
                     Time: 0.02 (IN) + 28.08 (EV) + 1.28 (GC) = 29.38 sec

referensi dan nomor dari: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fractions/egyptian.html

untuk menambahkan sesuatu, ini di bawah ini akan menjadi yang dioptimalkan untuk mencari fraksi panjang min yang memiliki penyebut maks kurang (dan tidak dioptimalkan untuk lengh)

L==>List FRAC INT

-- this would be the "Greedy Algorithm"
fracR(x,n)==
   y:=x;a:L:=[];c:=0;q:=denom x;q:=q^20
   for i in n.. repeat
      (c:=c+1)>1000  =>(a:=[];break)
      1/i>y          =>1
      member?(1/i,a) =>1
      a:=concat(a,1/i)
      (y:=y-1/i)=0  =>break
      numer(y)=1 and ~member?(y,a)=>(a:=concat(a,y);break)
      (i:=floor(1/y))>q           =>(a:=[];break)
   a

-- Return one List a=[1/x1,...,1/xn] with xn PI and x=r/s=reduce(+,a) or return [] for fail
Frazione2SommaReciproci(x:FRAC INT):L==
    a:L:=[]
    x>1       =>a
    numer(x)=1=>[x]
    n:=max(2,floor(1/x));xv:=m:=999;d:=denom x;zd:=divisors d;z:=copy zd; 
    w1:= if d>1.e10 then 1000 else 300; w2:= if d>1.e10 then 1000 else if d>1.e7 then 600 else if d>1.e5 then 500 else if d>1.e3 then 400 else 100;
    for i in 2..w1 repeat(mt:=(i*zd)::List PI;mv:=[yy for yy in mt|yy>=n];z:=sort(removeDuplicates(concat(z,mv)));#z>w2=>break)
    for i in z repeat
        (c:=maxIndex(b:=fracR(x,i)))=0=>1 
        c>m+1                         =>1
        if c<m or(c=m and m<999 and reduce(max,map(denom,b))<xv)then(m:=c;a:=b;xv:=reduce(max,map(denom,a)))
        v:=reduce(+,delete(b,1))
        for j in z repeat
              (c:=1+maxIndex(q:=fracR(v,j)))=1=>1
              member?(b.1,q)                  =>1
              q:=concat(b.1,q)
              if c<m or(c=m and m<999 and reduce(max,map(denom,q))<xv)then(m:=c;a:=q;xv:=reduce(max,map(denom,a)))
    reverse(sort a)

hasil:

(5) -> [[i,Frazione2SommaReciproci(i)] for i in [1/23,2/23,43/48,8/11,5/121,2020/2064,6745/7604,77/79,732/733]]
   (5)
      1   1      2   1  1      43  1 1  1      8  1 1  1  1
   [[--,[--]], [--,[--,---]], [--,[-,-,--]], [--,[-,-,--,--]],
     23  23     23  12 276     48  2 3 16     11  2 6 22 66
      5    1  1   1      505  1 1 1  1    1
    [---,[--,---,---]], [---,[-,-,-,---,----]],
     121  33 121 363     516  2 3 7 602 1204
     6745  1 1  1  1    1      1       77  1 1 1  1  1   1
    [----,[-,-,--,---,-----,------]], [--,[-,-,-,--,---,---]],
     7604  2 3 19 950 72238 570300     79  2 3 8 79 474 632
     732  1 1 1  1   1    1     1
    [---,[-,-,-,--,----,-----,-----]]]
     733  2 3 7 45 7330 20524 26388
                                                      Type: List List Any
                     Time: 0.08 (IN) + 53.45 (EV) + 3.03 (GC) = 56.57 sec
(6) -> Frazione2SommaReciproci(124547787/123456789456123456)
   (6)
        1            1               1                  1
   [---------, ------------, ----------------, -------------------,
    994074172  347757767307  2764751529594496  1142210063701888512
                      1
    -------------------------------------]
    2531144929865351036156388364636113408
                                              Type: List Fraction Integer
         Time: 0.15 (IN) + 78.30 (EV) + 0.02 (OT) + 5.28 (GC) = 83.75 sec
(7) -> Frazione2SommaReciproci(27538/27539)
         1 1 1  1   1     1       1       1
   (7)  [-,-,-,--,----,-------,-------,-------]
         2 3 7 43 1935 3717765 5204871 7105062
                                              Type: List Fraction Integer
                     Time: 0.05 (IN) + 45.43 (EV) + 2.42 (GC) = 47.90 sec

Tampaknya banyak penyebut yang baik sebagai pembagi faktor dari penyebut fraksi input.

RosLuP
sumber
0

C, 85 78 byte

Ditingkatkan oleh @ceilingcat , 78 byte:

n,d;main(i){for(scanf("%i%i",&n,&d);n;n*++i/d&&printf("%i ",i,d*=i,n=n*i-d));}

Cobalah online!


Jawaban asli saya, 85 byte:

n,d,i=1;main(){for(scanf("%i%i",&n,&d);n&&++i;n*i/d?printf("%i ",i),n=n*i-d,d*=i:0);}

Cobalah online!

Bagian dari kredit harus pergi ke Jonathan Frech , yang menulis ini solusi 94 byte yang saya diperbaiki.

OverclockedSanic
sumber
0

APL (NARS), 2502 byte

fdn←{1∧÷⍵}⋄fnm←{1∧⍵}⋄ffl←{m←⎕ct⋄⎕ct←0⋄r←⌊⍵⋄⎕ct←m⋄r}⋄divisori←{a[⍋a←{∪×/¨{0=≢⍵:⊂⍬⋄s,(⊂1⌷⍵),¨s←∇1↓⍵}π⍵}⍵]}

r←frRF w;x;y;c;q;i;j
(x i)←w⋄i-←1⋄y←x⋄r←⍬⋄c←0⋄q←fdn x⋄q←q*20
i+←1
→4×⍳∼1000<c+←1⋄→6
j←÷i⋄→2×⍳j>y⋄→2×⍳(⊂j)∊r⋄r←r,(⊂j)⋄y←y-j⋄→0×⍳y=0⋄→5×⍳1≠fnm y⋄→5×⍳(⊂y)∊r⋄r←r,⊂y⋄→0
→2×⍳∼q<i←ffl ÷y
r←⍬

r←fr2SumF x;n;xv;m;d;zd;z;i;b;c;t;v;j;k;q;w1;w2;t;b1
z←r←⍬⋄→0×⍳1≤ffl x
:if 1=fnm x⋄r←,⊂x⋄→0⋄:endif
n←2⌈ffl÷x⋄xv←m←999⋄d←fdn x⋄zd←divisori d
w1←1000⋄w2←50⋄:if d>1.e10⋄w2←700⋄:elseif d>1.e7⋄w2←600⋄:elseif d>1.e5⋄w2←500⋄:elseif d>1.e3⋄w2←400⋄:elseif d>1.e2⋄w2←100⋄:endif
:for i :in ⍳w1⋄z←∪z∪k/⍨{⍵≥n}¨k←i×zd⋄:if w2<≢z⋄:leave⋄:endif⋄:endfor
z←∪z∪zd⋄z←z[⍋z]
:for i :in z
    :if 0=c←≢b←frRF x i ⋄:continue⋄:endif
    :if      c>m+1      ⋄:continue⋄:endif
    :if      c<m        ⋄m←c⋄r←b⋄xv←⌈/fdn¨b
    :elseif (c=m)∧(m<999)
         :if xv>t←⌈/fdn¨b⋄m←c⋄r←b⋄xv←t⋄:endif
    :endif
    :if c≤2⋄:continue⋄:endif
    v←↑+/1↓b⋄b1←(⊂↑b)
    :for j :in z
       :if 1=c←1+≢q←frRF v j⋄:continue⋄:endif
       :if        b1∊q      ⋄:continue⋄:endif
       q←b1,q
       :if  c<m⋄m←c⋄r←q     ⋄xv←⌈/fdn¨q
       :elseif (c=m)∧(m<999)
           :if xv>t←⌈/fdn¨q⋄m←c⋄r←q⋄xv←t⋄:endif
       :endif
    :endfor
:endfor
→0×⍳1≥≢r⋄r←r[⍋fdn¨r]

Traslation dari kode AXIOM untuk masalah ini, ke APL, menggunakan untuk pertama kalinya (untuk saya) tipe fraksi (yaitu bignum ...).

103r233 berarti fraksi 103/233. Uji:

  ⎕fmt fr2SumF 1r23
┌1────┐
│ 1r23│
└~────┘
  ⎕fmt fr2SumF 2r23
┌2──────────┐
│ 1r12 1r276│
└~──────────┘
  ⎕fmt fr2SumF 43r48
┌3────────────┐
│ 1r2 1r3 1r16│
└~────────────┘
  fr2SumF 8r11
1r2 1r6 1r22 1r66 
  fr2SumF 5r121
1r33 1r121 1r363 
  fr2SumF 2020r2064
1r2 1r3 1r7 1r602 1r1204 
  fr2SumF 6745r7604
1r2 1r3 1r19 1r950 1r72238 1r570300 
  fr2SumF 77r79
1r2 1r3 1r8 1r79 1r474 1r632 
  fr2SumF 732r733
1r2 1r3 1r7 1r45 1r7330 1r20524 1r26388 
  fr2SumF 27538r27539
1r2 1r3 1r7 1r43 1r1935 1r3717765 1r5204871 1r7105062 
  fr2SumF 124547787r123456789456123456
1r994074172 1r347757767307 1r2764751529594496 1r1142210063701888512 
  1r2531144929865351036156388364636113408 
RosLuP
sumber