Phân số Ai Cập


20

Tổng quan:

Từ Wikipedia : Một phần Ai Cập là tổng các phân số đơn vị riêng biệt. Nghĩa là, mỗi phân số trong biểu thức có tử số bằng 1 và mẫu số là số nguyên dương và tất cả các mẫu số khác nhau. Giá trị của biểu thức loại này là số hữu tỷ dương a / b. Mỗi số hữu tỷ dương có thể được biểu thị bằng một phần Ai Cập.

Thử thách:

Viết hàm ngắn nhất sẽ trả về các giá trị của tất cả các mẫu số cho tập hợp phân số đơn vị nhỏ nhất cộng với một phân số nhất định.

Quy tắc / ràng buộc:

  • Đầu vào sẽ là hai giá trị nguyên dương.
    • Điều này có thể được bật STDIN, argvphân tách bằng dấu phẩy, phân tách không gian hoặc bất kỳ phương pháp nào khác bạn thích.
  • Giá trị đầu vào đầu tiên phải là tử số và giá trị đầu vào thứ hai là mẫu số.
  • Giá trị đầu vào đầu tiên phải nhỏ hơn giá trị thứ hai.
  • Đầu ra có thể bao gồm (các) giá trị vượt quá giới hạn bộ nhớ của hệ thống / ngôn ngữ của bạn (RAM, MAX_INT hoặc bất kỳ ràng buộc mã / hệ thống nào khác tồn tại). Nếu điều này xảy ra, chỉ cần cắt bớt kết quả ở giá trị cao nhất có thể và lưu ý rằng bằng cách nào đó (nghĩa là ...).
  • Đầu ra phải có khả năng xử lý giá trị mẫu số tối thiểu 2.147.483.647 (2 31 -1, ký 32 bit int).
    • Giá trị cao hơn ( long, v.v.) là hoàn toàn chấp nhận được.
  • Đầu ra sẽ là một danh sách của tất cả các giá trị mẫu số của tập hợp đơn vị nhỏ nhất được tìm thấy (hoặc chính các phân số, nghĩa là 1/2).
  • Đầu ra phải được sắp xếp tăng dần theo giá trị của mẫu số (giảm dần theo giá trị của phân số).
  • Đầu ra có thể được phân định bất kỳ cách nào bạn muốn, nhưng phải có một số ký tự ở giữa để phân biệt một giá trị với giá trị tiếp theo.
  • Đây là mã golf, vì vậy giải pháp ngắn nhất sẽ thắng.

Sơ đồ:

  • Đầu vào 1:

    43, 48

  • Đầu ra 1:

    2, 3, 16

  • Đầu vào 2:

    8/11

  • Đầu ra 2:

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

  • Đầu vào 3:

    5 121

  • Đầu ra 3:

    33 121 363


Đầu vào / đầu ra 2 nên 8, 112, 6, 22, 66phải không?
mellamokb

2
Một gợi ý có thể, để loại bỏ sự khó tính, sẽ là yêu cầu tập hợp các phân số đơn vị nhỏ nhất với mẫu số nhỏ nhất. Ví dụ, 1/2 1/6 1/22 1/66sẽ thích hợp hơn 1/2 1/5 1/37 1/4070cho đầu vào 8/11.
primo

2
Tôi đề nghị thêm 5/121 = 1/33+1/121+1/363vào các trường hợp thử nghiệm. Tất cả các chương trình tham lam (bao gồm cả của tôi) đưa ra 5 phân số cho nó. Ví dụ lấy từ Wikipedia .
ugoren

1
@primo Tôi nghĩ rằng nếu có nhiều mức tối thiểu, thì cái nào có thể tìm thấy sẽ được chấp nhận. Nếu một thuật toán có thể được viết với ít ký tự hơn, tôi sẽ không muốn cản trở giải pháp đó.
Gaffi

1
Đã +1 khi tôi thực sự đã học về các phân số của Ai Cập trong khóa học Lịch sử toán học (và phải làm toán với họ, cũng như tìm ra các khoản tiền nhỏ như bài toán này.) Một thử thách hay và sáng tạo.
mbomb007

Câu trả lời:


6

Lisp thường gặp, 137 ký tự

(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 873940180913 1527612795642093418846225)

Không cần phải lo lắng về số lượng lớn, hoặc xử lý ký hiệu phân số!


(defun z (n) (nhãn ((i (nsr) (cond ((= n 0) r) ((<n (/ 1 s)) (in (trần (/ 1 n)) r)) (t ( i (- n (/ 1 s)) (1+ s) (cons sr)))))) (đảo ngược (trong 2 '())))) (z 43/48) Hiển thị không dẫn đến ... Những gì tôi phải sử dụng để in kết quả?
RosLuP

1
(in (z 103/333)) trả về một danh sách gồm 5 số nhưng sẽ tồn tại một danh sách gồm 4 số là: 1 / 4,1 / 18,1 / 333,1 / 1332. Vì vậy, chức năng trên sẽ không trả về mức tối thiểu.
RosLuP

8

Python 2, 169 167 ký tự

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

Đưa ra các đối số được phân tách bằng dấu phẩy trên stdin và in danh sách python trên thiết bị xuất chuẩn.

$ echo 8,11 | ./egypt.py 
[2, 5, 37, 4070]

2
1. Tôi nghĩ bạn có thể lưu hai ký tự bằng cách sử dụng tab ở cấp độ thụt thứ hai. 2. Tập lệnh không biểu thị cắt ngắn do vượt quá giới hạn bộ nhớ hệ thống.
hộp bánh mì

Trong Tio Mã của bạn hết bộ nhớ chỉ 103/45533
RosLuP

Thay vào đó, trong Ideone, mã của bạn gặp lỗi thời gian chạy cho cùng một đầu vào 103,45533: Lỗi thời gian chạy #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);

Điều này có thể được thực hiện ngắn hơn, nhưng tử số và mẫu số hiện tại cần phải được giữ nguyên như một số nguyên để tránh lỗi làm tròn dấu phẩy động (thay vì giữ nguyên phân số hiện tại).

Sử dụng mẫu:

$ echo 43 48 | php egyptian-fraction.php
2 3 16
$ echo 8 11 | php egyptian-fraction.php
2 5 37 4070

Toán tử dấu phẩy mô phỏng như các đối số vô dụng để printf? Tôi nên lưu thủ thuật này ở đâu đó.
Konrad Borowski

1
Tôi khá chắc chắn đây là Thuật toán Tham lam , vì vậy nó sẽ không luôn đưa ra các phân số nhỏ nhất. Nếu bạn chạy nó với đầu vào như 5 121hoặc 31 311, nó sẽ trả lời sai (sau một thời gian rất dài).
grc

@grc 31/311 -> {a [1] -> 11, a [2] -> 115, a [3] -> 13570, a [4] -> 46422970}
Tiến sĩ belisarius

4

C, 163 177 ký tự

6/6 : Cuối cùng, chương trình hiện xử lý chính xác việc cắt ngắn trong mọi trường hợp. Mất nhiều thời gian hơn tôi mong đợi, nhưng nó đáng giá. Chương trình nên tuân thủ 100% các yêu cầu vấn đề ngay bây giờ.

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]);}

Chương trình lấy tử số và mẫu số trên đầu vào tiêu chuẩn. Mẫu số được in thành đầu ra tiêu chuẩn, mỗi dòng trên một dòng. Đầu ra bị cắt được biểu thị bằng cách in mẫu số 0 ở cuối danh sách:

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

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

Mẫu số trong ví dụ thứ hai tổng cộng là 95485142815/107645519046, khác với 6745/ 7604 khoảng 1e-14.


Một lần nữa, tôi nghĩ rằng đây là một thuật toán tham lam.
grc

Vòng lặp ngoài cùng khám phá tất cả các câu trả lời có thể có của mẫu số N trước khi bắt đầu thử nghiệm câu trả lời của mẫu số N + 1. Bạn có thể gọi nó là tham lam, tôi cho rằng, nhưng tôi tin rằng nó đáp ứng được vấn đề đã nêu.
hộp bánh mì

Xin lỗi, tôi lấy lại nó. Nó không tuân theo giải pháp tham lam, nhưng tôi đã thấy rằng nó không hoàn toàn chính xác cho một số đầu vào ( 31 311ví dụ).
grc

31 311tràn, nhưng chương trình không gắn cờ nó.
hộp bánh mì

3

Python, 61 ký tự

Nhập từ STDIN, được phân tách bằng dấu phẩy.
Đầu ra cho STDOUT, dòng mới tách ra.
Không phải lúc nào cũng trả về đại diện ngắn nhất (ví dụ: 5/121).

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

Các ký tự được tính mà không có dòng mới không cần thiết (nghĩa là tham gia tất cả các dòng trong khi whilesử dụng ;).
Các phần là a/b.
iđược b/alàm tròn lên, vì vậy tôi biết 1/i <= a/b.
Sau khi in 1/i, tôi thay thế a/bbằng a/b - 1/i, đó là (a*i-b)/(i*b).


Tôi muốn bỏ phiếu lên này, vì nó quá nhỏ, nhưng nó chỉ mất rằng một mảnh!
Gaffi

2
Tôi muốn sửa cái này, nhưng nó sẽ không quá nhỏ ... Tôi có cảm giác tôi sẽ chỉ phát minh lại giải pháp của 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;}}

Dùng thử trực tuyến

chỉnh sửa: Một phiên bản ngắn hơn của mã đã được đăng trong các bình luận để tôi thay thế nó. Cảm ơn!


2
Xin Chào và Chào Mừng đến với trang! Đây là một cuộc thi golf-code , vì vậy mục tiêu là làm cho mã của bạn càng ngắn càng tốt . Có vẻ như có rất nhiều điều bạn có thể làm để làm cho mã của bạn ngắn hơn. Ví dụ: bạn có thể xóa tất cả các khoảng trắng không cần thiết khỏi câu trả lời của mình.
DJMcMayhem

@DJMcMayhem Cảm ơn ngài, đã hiểu và đã làm.
う ち わ

Xin chào, chào mừng đến với PPCG! Có lẽ bạn có thể thêm một liên kết TryItOnline với mã kiểm tra cho các trường hợp thử nghiệm trong thử thách? Ngoài ra, một số điều bạn có thể chơi golf: for(i=2;n>0&&i>0;i++)có thể for(i=1;n>0&++i>0;); dấu ngoặc của vòng lặp for có thể được loại bỏ (vì nó chỉ có ifbên trong); d=d*i;có thể được d*=i;; và tôi không hoàn toàn chắc chắn, nhưng tôi nghĩ #include <stdio.h>có thể không có khoảng trắng : #include<stdio.h>. Ồ, và thật thú vị khi đọc Mẹo chơi golf bằng CMẹo chơi gôn bằng <tất cả các ngôn ngữ>
Kevin Cruijssen

@KevinCruijssen Cảm ơn những lời khuyên.
う ち わ


1

Stax , 18 byte

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

Chạy và gỡ lỗi nó

Ở mỗi bước, nó cố gắng giảm thiểu tử số tiếp theo . Nó dường như hoạt động, nhưng tôi không thể chứng minh điều đó.


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))

Ý tưởng sẽ được áp dụng "Thuật toán tham lam" với các điểm ban đầu khác nhau và lưu danh sách có độ dài tối thiểu. Nhưng không phải lúc nào nó cũng tìm được giải pháp tối thiểu với ít khác biệt: "mảng A sẽ nhỏ hơn mảng B khi và chỉ khi A có ít phần tử của B hoặc nếu số phần tử của A bằng số phần tử của B , so với A, nó nhỏ hơn B nếu phần tử nhỏ hơn của A lớn hơn số lượng, hơn phần tử nhỏ hơn của B ". Thử thách

-- 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

tham chiếu và số từ: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fraction/egyptian.html

để thêm một cái gì đó, đây là phần được tối ưu hóa để tìm phân số độ dài tối thiểu có mẫu số tối đa ít hơn (và không được tối ưu hóa cho chiều dài)

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)

kết quả:

(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

Có vẻ như nhiều mẫu số tốt có các ước số nhân tố của mẫu số phân số đầu vào.



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]

Chuyển đổi từ mã AXIOM cho vấn đề này, sang APL, sử dụng lần đầu tiên (đối với tôi) loại phân số (đó là bignum ...).

103r233 có nghĩa là phân số 103/233. Kiểm tra:

  ⎕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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.