97 lines
1.8 KiB
Plaintext
97 lines
1.8 KiB
Plaintext
PROGRAM RATIONAL_ARITH
|
|
|
|
!
|
|
! for rosettacode.org
|
|
!
|
|
|
|
TYPE RATIONAL=(NUM,DEN)
|
|
|
|
DIM SUM:RATIONAL,ONE:RATIONAL,KF:RATIONAL
|
|
|
|
DIM A:RATIONAL,B:RATIONAL
|
|
PROCEDURE ABS(A.->A.)
|
|
A.NUM=ABS(A.NUM)
|
|
END PROCEDURE
|
|
|
|
PROCEDURE NEG(A.->A.)
|
|
A.NUM=-A.NUM
|
|
END PROCEDURE
|
|
|
|
PROCEDURE ADD(A.,B.->A.)
|
|
LOCAL T
|
|
T=A.DEN*B.DEN
|
|
A.NUM=A.NUM*B.DEN+B.NUM*A.DEN
|
|
A.DEN=T
|
|
END PROCEDURE
|
|
|
|
PROCEDURE SUB(A.,B.->A.)
|
|
LOCAL T
|
|
T=A.DEN*B.DEN
|
|
A.NUM=A.NUM*B.DEN-B.NUM*A.DEN
|
|
A.DEN=T
|
|
END PROCEDURE
|
|
|
|
PROCEDURE MULT(A.,B.->A.)
|
|
A.NUM*=B.NUM A.DEN*=B.DEN
|
|
END PROCEDURE
|
|
|
|
PROCEDURE DIVIDE(A.,B.->A.)
|
|
A.NUM*=B.DEN
|
|
A.DEN*=B.NUM
|
|
END PROCEDURE
|
|
|
|
PROCEDURE EQ(A.,B.->RES%)
|
|
RES%=A.NUM*B.DEN=B.NUM*A.DEN
|
|
END PROCEDURE
|
|
|
|
PROCEDURE LT(A.,B.->RES%)
|
|
RES%=A.NUM*B.DEN<B.NUM*A.DEN
|
|
END PROCEDURE
|
|
|
|
PROCEDURE GT(A.,B.->RES%)
|
|
RES%=A.NUM*B.DEN>B.NUM*A.DEN
|
|
END PROCEDURE
|
|
|
|
PROCEDURE NE(A.,B.->RES%)
|
|
RES%=A.NUM*B.DEN<>B.NUM*A.DEN
|
|
END PROCEDURE
|
|
|
|
PROCEDURE LE(A.,B.->RES%)
|
|
RES%=A.NUM*B.DEN<=B.NUM*A.DEN
|
|
END PROCEDURE
|
|
|
|
PROCEDURE GE(A.,B.->RES%)
|
|
RES%=A.NUM*B.DEN>=B.NUM*A.DEN
|
|
END PROCEDURE
|
|
|
|
PROCEDURE NORMALIZE(A.->A.)
|
|
LOCAL A,B,T
|
|
A=A.NUM B=A.DEN
|
|
WHILE B<>0 DO
|
|
T=A
|
|
A=B
|
|
B=T-B*INT(T/B)
|
|
END WHILE
|
|
A.NUM/=A A.DEN/=A
|
|
IF A.DEN<0 THEN A.NUM*=-1 A.DEN*=-1 END IF
|
|
END PROCEDURE
|
|
|
|
BEGIN
|
|
ONE.NUM=1 ONE.DEN=1
|
|
FOR N=2 TO 2^19-1 DO
|
|
SUM.NUM=1 SUM.DEN=N
|
|
FOR K=2 TO SQR(N) DO
|
|
IF N=K*INT(N/K) THEN
|
|
KF.NUM=1 KF.DEN=K
|
|
ADD(SUM.,KF.->SUM.)
|
|
NORMALIZE(SUM.->SUM.)
|
|
KF.DEN=INT(N/K)
|
|
ADD(SUM.,KF.->SUM.)
|
|
NORMALIZE(SUM.->SUM.)
|
|
END IF
|
|
END FOR
|
|
EQ(SUM.,ONE.->RES%)
|
|
IF RES% THEN PRINT(N;" is perfect") END IF
|
|
END FOR
|
|
END PROGRAM
|