Long Multiplication Program - FREEWARE, listed 06-08-2004 10 ' longmult.bas - FREEWARE 2004 20 GOTO 150 ' begin 30 SAVE"longmult.bas":LIST-120 40 GOTO 840 ' init sum 50 GOTO 960 ' group of 3 60 GOTO 1030 ' add 000 with spacing 70 GOTO 1180 ' draw lines 1 80 GOTO 1190 ' draw lines 2 90 GOTO 1230 ' print results 100 GOTO 1390 ' count characters 110 GOTO 1450 ' print sum 120 GOTO 1970 ' get key input 130 GOTO 2020 ' test for a valid number 140 ' begin 150 CLS 160 PRINT "****************************************" 170 PRINT "* LONG MULTIPRECISION MULTIPLICATION *" 180 PRINT "* rewritten for GW-BASIC *" 190 PRINT "* November 2, 1992 *" 200 PRINT "* Eric F. Tchong *" 210 PRINT "* Use only whole numbers *" 220 PRINT "* quits program *" 230 PRINT "****************************************" 240 U=400:T=200:P$="n":KEY OFF:DEFSTR Q:Q=MKI$(0) 250 DIM A$(U),B$(U),C$(U),D$(U),E$(U),F$(U),N$(T),Z$(T),A(T),B(T),C(T),D(T) 260 DEF FN L(X)=INT(X/1000000!):DEF FN M(X)=INT((X-FN L(X)*1000000!)/1000) 270 DEF FN R(X)=X-FN L(X)*1000000!-FN M(X)*1000 280 FOR Z=0 TO 100:N$(Z)="":NEXT 290 FOR Z=1 TO 100:N$(Z)=N$(Z-1)+"0":NEXT 300 PRINT:PRINT 310 PRINT "Save results in longmult.asc file [y/n] ?" 320 GOSUB 120 330 IF EC=89 OR EC=121 THEN COPY=1 ELSE COPY=0 340 IF COPY THEN OPEN "O",#1,"longmult.asc" 350 ' Select with or without spacing menu 360 CLS:PRINT "Do you wish to ..." 370 PRINT "(1)-----See results with spacing? 12 345 678 901" 380 PRINT "(2)-----See results without spacing? 12345678901" 390 PRINT "(3)-----Stop":PRINT:PRINT "1, 2, or 3 ? "; 400 GOSUB 120:IF CH<1 OR CH>3 THEN 360 410 CLS 420 ON CH GOTO 440,1570,2120 430 ' Results with spacing 440 CLS:PRINT "Do you wish to ..." 450 PRINT "(1)-----Multiply two numbers" 460 PRINT "(2)-----Use product as the multiplicand" 470 PRINT "(3)-----Use a constant" 480 PRINT "(4)-----Spacing menu":PRINT:PRINT "1, 2, 3, or 4 ? "; 490 GOSUB 120:IF CH<1 OR CH>4 THEN 440 500 CLS 510 ON CH GOTO 520,520,520,360 520 INPUT"Multiplicand -1=menu ";VN$:IF VN$="-1" THEN 440 530 GOSUB 130:IF NG=0 THEN NG=1:GOTO 520 ELSE A$=VN$ 540 INPUT"Multiplier -1=menu ";VN$:IF VN$="-1" THEN 440 550 GOSUB 130:IF NG=0 THEN NG=1:GOTO 540 ELSE B$=VN$ 560 PRINT:IF LEN(A$)3 THEN Z=3 1000 B(K)=VAL(MID$(A$,W,Z)) 1010 NEXT:RETURN 1020 ' add 000 with spacing 1030 X=D(S+1-K):S6=X+S6:IF S6=0 THEN RETURN 1040 D$=STR$(X) 1050 IF X>99 THEN 1130 1060 IF X>9 THEN 1110 1070 IF X>0 THEN 1090 1080 G$=" 000":E$="000":GOTO 1140 1090 IF EQ=0 THEN G$=D$:E$=RIGHT$(G$,1) ELSE G$=" 00"+RIGHT$(D$,1):E$=RIGHT$(G$,3) 1100 GOTO 1140 1110 IF EQ=0 THEN G$=D$:E$=RIGHT$(G$,2) ELSE G$=" 0"+RIGHT$(D$,2):E$=RIGHT$(G$,3) 1120 GOTO 1140 1130 G$=D$:E$=RIGHT$(G$,3) 1140 IF EQ=0 THEN 1150 ELSE 1160 1150 C$=G$:F$=E$:EQ=1:RETURN 1160 C$=C$+G$:F$=F$+E$:RETURN 1170 ' draw lines 1180 L=LEN(C$) 1190 PRINT STRING$(L,"Ä") 1200 IF COPY THEN PRINT #1, STRING$(L,"-") 1210 RETURN 1220 ' print results 1230 PRINT TAB(L)""; 1240 Z$="":FOR J=LEN(M$) TO 1 STEP -1:Z$=Z$+MID$(M$,J,1):NEXT 1250 IF LEN(Z$)/3<>INT(LEN(Z$)/3) THEN PRINT " ";:EQ=EQ+1 1260 FOR J=LEN(Z$) TO 1 STEP -1 1270 IF J/3=INT(J/3) THEN PRINT " ";:EQ=EQ+1 1280 PRINT MID$(Z$,J,1);:EQ=EQ+1 1290 NEXT 1300 ' send to diskfile 1310 IF COPY THEN 1320 ELSE RETURN 1320 PRINT #1, TAB(L)""; 1330 IF LEN(Z$)/3<>INT(LEN(Z$)/3) THEN PRINT #1, " "; 1340 FOR J=LEN(Z$) TO 1 STEP -1 1350 IF J/3=INT(J/3) THEN PRINT #1, " "; 1360 PRINT #1, MID$(Z$,J,1); 1370 NEXT:RETURN 1380 ' count characters 1390 EQ=0:IF LEN(M$)/3<>INT(LEN(M$)/3) THEN EQ=EQ+1 1400 FOR J=LEN(M$) TO 1 STEP -1 1410 IF J/3=INT(J/3) THEN EQ=EQ+1 1420 EQ=EQ+1 1430 NEXT:RETURN 1440 ' print sum 1450 PRINT TAB(L)""; 1460 Z$="":FOR J=LEN(M$) TO 1 STEP -1:Z$=Z$+MID$(M$,J,1):NEXT 1470 FOR J=LEN(Z$) TO 1 STEP -1 1480 PRINT MID$(Z$,J,1); 1490 NEXT 1500 ' send to diskfile 1510 IF COPY THEN 1520 ELSE RETURN 1520 PRINT #1, TAB(L)""; 1530 FOR J=LEN(Z$) TO 1 STEP -1 1540 PRINT #1, MID$(Z$,J,1); 1550 NEXT:RETURN 1560 ' Results without spacing 1570 CLS:PRINT "Do you wish to ..." 1580 PRINT "(1)-----Multiply two numbers" 1590 PRINT "(2)-----Use product as the multiplicand" 1600 PRINT "(3)-----Use a constant" 1610 PRINT "(4)-----Spacing menu":PRINT:PRINT "1, 2, 3, or 4 ? "; 1620 GOSUB 120:IF CH<1 OR CH>4 THEN 1570 1630 CLS 1640 ON CH GOTO 1650,1650,1650,360 1650 INPUT"Multiplicand -1=menu ";VN$:IF VN$="-1" THEN 1570 1660 GOSUB 130:IF NG=0 THEN NG=1:GOTO 1650 ELSE A$=VN$ 1670 INPUT"Multiplier -1=menu ";VN$:IF VN$="-1" THEN 1570 1680 GOSUB 130:IF NG=0 THEN NG=1:GOTO 1670 ELSE B$=VN$ 1690 PRINT:IF LEN(A$)1 THEN NG=0:PRINT:BEEP:RETURN 2040 IF VN$="" THEN 2120 2050 FOR X=1 TO L 2060 Z=ASC(MID$(VN$,X,1)):IF MID$(VN$,X,1)="." THEN TC=2:GOTO 2080 2070 IF Z<48 OR Z>57 THEN NG=0:PRINT:BEEP:RETURN 2080 NEXT 2090 IF TC>1 THEN NG=0:PRINT:BEEP:RETURN 2100 NG=1:RETURN 2110 ' exit 2120 IF COPY THEN CLOSE #1 2130 KEY 5,"longmult.bas":KEY 6,CHR$(34)+",a":KEY ON:CLS