Category : Science and Education
Archive   : LONGMATH.ZIP
Filename : LONGMATH.BAS

 
Output of file : LONGMATH.BAS contained in archive : LONGMATH.ZIP
10 'LONGMATH.BAS: Uses strings and arrays to perform operations on 200-digit
11 'numbers. From BYTE Magazine March 1985 by Peter Rice.
1000 '
1010 DEFINT A-Z
1020 DIM X%(200),Y%(200),Z%(200)
1030 PRINT "Enter a number, up to 200 digits: "
1040 INPUT XX$
1050 WHILE LEFT$(XX$,1)="0":XX$=RIGHT$(XX$,LEN(XX$)-1):WEND
1060 PRINT "Enter an operation: + - * /"
1070 INPUT OP$
1080 PRINT "Enter a second number, up to 100 digits: "
1090 INPUT YY$
1100 WHILE LEFT$(YY$,1)="0":YY$=RIGHT$(YY$,LEN(YY$)-1):WEND
1110 XL=LEN(XX$)
1120 FOR I=1 TO XL
1130 X%(XL-I)=VAL(MID$(XX$,I,1))
1140 NEXT I:X%(200)=XL-1
1150 YL=LEN(YY$)
1160 FOR I=1 TO YL
1170 Y%(YL-I)=VAL(MID$(YY$,I,1))
1180 NEXT I:Y%(100)=YL-1
1190 OPERATION=ASC(OP$)
1200 IF OPERATION=43 THEN GOSUB 10000:GOTO 1260
1210 IF OPERATION=45 THEN GOSUB 11000:GOTO 1260
1220 IF OPERATION=42 THEN GOSUB 12000:GOTO 1260
1230 IF OPERATION=47 THEN GOSUB 13000:GOTO 1260
1240 PRINT"Don't understand operation."
1250 GOTO 1610
1260 IF OPERATION=43 THEN GOTO 1300
1270 IF OPERATION=45 THEN GOTO 1360
1280 IF OPERATION=42 THEN GOTO 1450
1290 IF OPERATION=47 THEN GOTO 1510
1300 ZZ$=" "
1310 FOR I=0 TO Z%(200)
1320 ZZ$=CHR$(Z%(I)+48)+ZZ$
1330 NEXT I
1340 PRINT "The sum is: ":PRINT ZZ$
1350 GOTO 1610
1360 IF Z%(Z%(200))<0 THEN GOTO 1430
1370 ZZ$=" "
1380 FOR I=0 TO Z%(200)
1390 ZZ$=CHR$(Z%(I)+48)+ZZ$
1400 NEXT I
1410 PRINT "The difference is: ":PRINT ZZ$
1420 GOTO 1610
1430 PRINT "The difference is negative."
1440 GOTO 1610
1450 ZZ$=" "
1460 FOR I=0 TO Z%(200)
1470 ZZ$=CHR$(Z%(I)+48)+ZZ$
1480 NEXT I
1490 PRINT "The product is: ":PRINT ZZ$
1500 GOTO 1610
1510 XX$=" "
1520 FOR I=0 TO X%(200)
1530 XX$=CHR$(X%(I)+48)+XX$
1540 NEXT I
1550 ZZ$=" "
1560 FOR I=0 TO Z%(200)
1570 ZZ$=CHR$(Z%(I)+48)+ZZ$
1580 NEXT I
1590 PRINT "The quotient is: ":PRINT ZZ$
1600 PRINT "The remainder is: ":PRINT XX$
1610 FOR I=0 TO 200
1620 X%(I)=0:Z%(I)=0
1630 NEXT I
1640 FOR I=0 TO 100
1650 Y%(I)=0
1660 NEXT I
1670 GOTO 1030
10000 'Addition
10010 IF X%(200)>Y%(100) THEN Z%(200)=X%(200) ELSE Z%(200)=Y%(100)
10020 FOR I=0 TO Z%(200)
10030 Z%(I)=Z%(I)+X%(I)+Y%(I)
10040 IF Z%(I)>=10 THEN Z%(I+1)=Z%(I+1)+1:Z%(I)=Z%(I)-10
10050 NEXT I
10060 IF Z%(Z%(200)+1)>0 THEN Z%(200)=Z%(200)+1
10070 RETURN
11000 'Subtraction
11010 IF X%(200)>Y%(100) THEN N=X%(200) ELSE N=Y%(100)
11020 FOR I=0 TO N
11030 Z%(I)=Z%(I)+X%(I)-Y%(I)
11040 IF Z%(I)<0 THEN Z%(I)=Z%(I)+10:Z%(I+1)=-1
11050 NEXT I
11060 IF Z%(N+1)<0 THEN N=N+1
11070 WHILE Z%(N)=0:IF N=0 THEN GOTO 11080 ELSE N=N-1:WEND
11080 Z%(200)=N
11090 RETURN
12000 'Multiplication
12010 FOR I=0 TO X%(200)
12020 FOR J=0 TO Y%(100)
12030 Z%(I+J)=X%(I)*Y%(J)+Z%(I+J)
12040 A=Z%(I+J)\10
12050 Z%(I+J)=Z%(I+J) MOD 10
12060 Z%(I+J+1)=Z%(I+J+1)+A
12070 NEXT J
12080 NEXT I
12090 INDEX=X%(200)+Y%(100)+1
12100 IF Z%(INDEX)>0 THEN Z%(200)=INDEX ELSE Z%(200)=INDEX-1
12110 RETURN
13000 'Division
13010 IF X%(200)<=Y%(100) THEN AL=Y%(100) ELSE AL=X%(200)
13020 IF X%(AL)>Y%(AL) THEN GOTO 13140
13030 GOSUB 11000
13040 IF Z%(Z%(200))>=0 THEN GOTO 13090
13050 FOR I=0 TO 200
13060 Z%(I)=0
13070 NEXT I
13080 RETURN
13090 FOR I=0 TO 200
13100 X%(I)=Z%(I):Z%(I)=0
13110 NEXT I
13120 Z%(0)=1
13130 RETURN
13140 D=10\(Y%(Y%(100))+1)
13150 IF D=1 THEN GOTO 13340
13160 FOR I=0 TO X%(200)
13170 X%(I)=D*X%(I)
13180 NEXT I
13190 FOR I=0 TO X%(200)
13200 W=X%(I)
13210 X%(I)=W MOD 10
13220 X%(I+1)=X%(I+1)+W\10
13230 NEXT I
13240 IF X%(X%(200)+1)>0 THEN X%(200)=X%(200)+1
13250 FOR I=0 TO Y%(100)
13260 Y%(I)=D*Y%(I)
13270 NEXT I
13280 FOR I=0 TO Y%(100)
13290 W=Y%(I)
13300 Y%(I)=W MOD 10
13310 Y%(I+1)=Y%(I+1)+W\10
13320 NEXT I
13330 IF Y%(Y%(100)+1)>0 THEN Y%(100)=Y%(100)+1
13340 FOR K=X%(200) TO Y%(100) STEP -1
13350 IF X%(K+1)=Y%(Y%(100)) THEN C=9:GOTO 13370
13360 C=(X%(K+1)*10+X%(K))\Y%(Y%(100))
13365 IF Y%(100)=0 THEN GOTO 13400
13370 IF C*Y%(Y%(100)-1)<=(X%(K+1)*10+X%(K)-C*Y%(Y%(100)))*10+X%(K+1) THEN GOTO 13400
13380 C=C+1
13390 GOTO 13370
13400 M=K-Y%(100)
13410 FOR I=0 TO Y%(100)
13420 X%(M+I)=X%(M+I)-C*Y%(I)
13430 NEXT I
13440 FOR I=0 TO Y%(100)
13450 IF X%(M+I)>=0 THEN GOTO 13480
13460 X%(M+I+1)=X%(M+I+1)+X%(M+I)\10-1
13470 X%(M+I)=X%(M+I)+(1-X%(M+I)\10)*10
13480 W=X%(M+I)
13490 X%(M+I)=W MOD 10
13500 X%(M+I+1)=X%(M+I+1)+W\10
13510 NEXT I
13520 IF X%(K+1)>=0 THEN GOTO 13580
13530 FOR I=0 TO Y%(100)
13540 X%(M+I)=X%(M+I)+Y%(I)
13550 IF X%(M+I)>9 THEN X%(M+I+1)=X%(M+I+1)+1:X%(M+I)=X%(M+I)-10
13560 NEXT I
13570 C=C-1
13580 Z%(M)=C
13590 NEXT K
13600 AL=X%(200)-Y%(100)
13610 IF Z%(AL)>0 THEN Z%(200)=AL ELSE Z%(200)=AL-1
13620 BX=Y%(100)
13630 WHILE X%(BX)=0
13650 IF BX=0 THEN GOTO 13670 ELSE BX=BX-1
13660 WEND
13670 X%(200)=BX
13680 FOR I=X%(200) TO 1 STEP -1
13690 W=X%(I)
13700 X%(I)=W\D
13710 X%(I-1)=X%(I-1)+10*(W MOD D)
13720 NEXT I
13730 X%(0)=X%(0)\D
13740 RETURN


  3 Responses to “Category : Science and Education
Archive   : LONGMATH.ZIP
Filename : LONGMATH.BAS

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/