10 REM"* M A X I P L Y * Multiply Very Large Numbers. J.Davis '94. 20 MODE7 30 *FX202,32 40 ONERRORGOTO3260 50 DIMA$(750):DIMB$(750):DIMT$(751) 60 MAX%=3000:FC%=0:VDU15 70 LA%=0:LB%=0:KA%=0:KB%=0 80 DA%=0:DB%=0:ZA%=0:ZB%=0 90 IFP%<>1 P%=0 100 *K.0"1234567890" 110 *K.1"9999999999" 120 CR$="":DG$=" Digits ":DI$="Digits " 130 LI$="Last input" 140 TMD$=CHR$(10)+"TOO MANY DIGITS-PLEASE PAY ATTENTION!" 150 MXP$=" * M A X I P L Y * " 160 PRINTMXP$ 170 PRINT"ENTER:1-3000 digits (decimal opt.); R; R1-3000; R0; S(quare);I(nfo);Esc" 180 VDU11:PRINT"";STRING$(39,"`"):VDU11 190 PRINT"FIRST NUMBER(max";MAX%;")?";:INPUT""IN$ 200 FD%=0:FL%=0:REM dec/dec & ran 210 IFLEFT$(IN$,1)<>"R" GOTO250 220 IFVAL(MID$(IN$,2,4))>MAX% OR LEN(IN$)>5 PRINTTMD$:GOTO190 230 R$=IN$:PROCrandom 240 GOTO330 250 IFLEFT$(IN$,1)="I"CHAIN"MAXINFO" 260 PROCcheck 270 PROCarrayA 280 GOTO320 290 PROCextendA 300 IFL%>MAX% PRINTLI$;L%;DI$:PRINTTMD$:GOTO290 310 PROCarrayA 320 IFL%=238 OR (L%=237 AND FF%=1) THEN290:REM ext/dec 330 IFFD%=0 DA%=LA% 340 IFLEN(A$(KA%))<4THENA$(KA%)=A$(KA%)+"0":ZA%=ZA%+1:GOTO340 350 IFMAX%=0 MAX%=1 360 PRINT"SECOND NUMBER(max";MAX%;")?";:INPUT""IN$ 370 FD%=0:FL%=1:REM dec/dec & ran 380 IFLEFT$(IN$,1)<>"R" GOTO420 390 IFVAL(MID$(IN$,2,4))>MAX% OR LEN(IN$)>5 PRINTTMD$:GOTO360 400 R$=IN$:PROCrandom 410 GOTO540 420 IFLEFT$(IN$,1)<>"S" THEN460 430 IFLA%>MAX% PRINT"Max Square1500"DG$:PRINTTMD$:GOTO360 440 PROCsquare 450 GOTO560 460 PROCcheck 470 IFL%>MAX% PRINTLI$;L%;DI$:PRINTTMD$:GOTO360 480 PROCarrayB 490 GOTO530 500 PROCextendB 510 IFL%>MAX% PRINTLI$;L%;DI$:PRINTTMD$:GOTO500 520 PROCarrayB 530 IFL%=238 OR (L%=237 AND FF%=1) THEN500 540 IFFD%=0 DB%=LB% 550 IFLEN(B$(KB%))<4THENB$(KB%)=B$(KB%)+"0":ZB%=ZB%+1:GOTO550 560 KC%=KA%+KB%:Z%=ZA%+ZB% 570 TIME=0:GOTO1560 580 "** 590 DEFPROCcheck 600 PRINT"Checking..." 610 IFFC%=1THEN630 620 S$=LEFT$(IN$,1):IFVAL(S$)=0ANDS$<>"."ANDLEN(IN$)>0 IN$=RIGHT$(IN$,LEN(IN$)-1):GOTO620:REM lead 0,char 630 A$="":B$="":C%=0:X%=1:FF%=0 640 M$=MID$(IN$,X%,20):M%=LEN(M$) 650 FORN%=1TOM% 660 S$=MID$(M$,N%,1) 670 IFS$<>"." OR FD%=1 THEN710 680 IFFL%=0 DA%=LA%+C%ELSEDB%=LB%+C% 690 FD%=1:FF%=1 700 GOTO740 710 IFASC(S$)<48 OR ASC(S$)>57 THEN740 720 A$=A$+S$ 730 IFFD%=0 C%=C%+1 740 NEXT 750 B$=B$+A$ 760 IFN%=21 THEN X%=X%+20:A$="":GOTO640 770 IFFD%=0THEN790 780 IFLEN(B$)-C%>0 AND RIGHT$(B$,1)="0" B$=LEFT$(B$,LEN(B$)-1):GOTO780 790 IFB$="" AND FC%=0 VDU11:PRINTSPC(12):PRINT"ANSWER:0 ":PRINT'"Try a more interesting number...":PRINT'"PRESS SPACE":VDU9:G=GET:RUN 800 IN$=B$:L%=LEN(IN$):LL%=L% 810 VDU11 820 ENDPROC 830 "** 840 DEFPROCarrayA 850 LA%=LA%+L%:MAX%=MAX%-L% 860 PRINTCR$;LA%;DG$:PRINT 870 IFFC%=1ANDIN$=""THEN920 880 FORN%=1TOLL%STEP4 890 KA%=KA%+1 900 A$(KA%)=MID$(IN$,N%,4) 910 NEXT 920 FC%=0 930 ENDPROC 940 "** 950 DEFPROCextendA 960 PRINT"FIRST NUMBER CONT.(max";MAX%;")?";:INPUT""IN$ 970 FC%=1:REM lead 0 OK 980 PROCcheck 990 IFL%>MAX% THEN1020 1000 PROCjoin(A$(KA%)) 1010 A$(KA%)=JJ$ 1020 ENDPROC 1030 "** 1040 DEFPROCarrayB 1050 LB%=LB%+L%:MAX%=MAX%-L% 1060 PRINTCR$;LB%;DG$:PRINT 1070 IFFC%=1ANDIN$=""THEN1120 1080 FORN%=1TOLL%STEP4 1090 KB%=KB%+1 1100 B$(KB%)=MID$(IN$,N%,4) 1110 NEXT 1120 ENDPROC 1130 "** 1140 DEFPROCextendB 1150 PRINT"SECOND NUMBER CONT.(max";MAX%;")?";:INPUT""IN$ 1160 FC%=1:REM lead 0 OK 1170 PROCcheck 1180 IFL%>MAX% THEN1210 1190 PROCjoin(B$(KB%)) 1200 B$(KB%)=JJ$ 1210 ENDPROC 1220 "** 1230 DEFPROCjoin(J$) 1240 G%=4-LEN(J$) 1250 J$=J$+LEFT$(IN$,G%) 1260 IN$=RIGHT$(IN$,LEN(IN$)-G%) 1270 LL%=L%-G%:JJ$=J$ 1280 ENDPROC 1290 "** 1300 DEFPROCrandom 1310 IFLEN(R$)=1 R%=RND(300):GOTO1340 1320 R%=VAL(RIGHT$(R$,LEN(R$)-1)) 1330 IFR%=0 R%=RND(1200) 1340 PRINT"RANDOM - ";R%;DG$ 1350 E%=(R%-1)DIV4 1360 FORN%=0TOE% 1370 S$=STR$(RND(9000)+999) 1380 IFN%=E% S$=LEFT$(S$,(R%-1)MOD4+1) 1390 IFFL%=0 A$(N%+1)=S$ELSEB$(N%+1)=S$ 1400 PRINTS$; 1410 NEXT 1420 IFFL%=0 KA%=N%:LA%=R%ELSEKB%=N%:LB%=R% 1430 MAX%=MAX%-R% 1440 PRINT'CR$;R%;DG$:PRINT 1450 ENDPROC 1460 "** 1470 DEFPROCsquare 1480 PRINT"SQUARE " 1490 KB%=KA%:LB%=LA%:MAX%=MAX%-LA% 1500 DB%=DA%:ZB%=ZA% 1510 FORN%=1TOKA% 1520 B$(N%)=A$(N%) 1530 NEXT 1540 PROCfirst 1550 ENDPROC 1560 FORN%=1TOKC% 1570 T$(N%)="0000" 1580 NEXT 1590 REM"** 1600 IFKA%*KB%<100000 THEN1650 1610 NM$=STR$(INT(LA%*LB%/800)) 1620 PRINT"Really? Well, OK.":PRINT'"This will take about an hour..." 1630 PRINT'"(With a pencil and a very large piece of paper, about "LEFT$(NM$,1)","RIGHT$(NM$,3)" hours.)":PRINT 1640 REM"Main Routine: 1650 FL%=0:VDU9; 1660 FORY%=1TOKB% 1670 FORX%=1TOKA% 1680 KZ%=X%+Y%-1 1690 M=VAL(A$(X%))*VAL(B$(Y%)) 1700 T$=STR$(VAL(T$(KZ%)+T$(KZ%+1))+M) 1710 IFLEN(T$)<8 T$="0"+T$:GOTO1710 1720 IFLEN(T$)=9 PROCcarryA 1730 Q%=1 1740 IFLEN(T$(KZ%-Q%))=5 PROCcarryB:GOTO1740 1750 T$(KZ%)=LEFT$(T$,4) 1760 T$(KZ%+1)=RIGHT$(T$,4) 1770 NEXTX% 1780 VDU8:PRINT"";Y%"/";KB%"|";TIME/100"sec":VDU9; 1790 IFKC%>=50 AND KB%>3 AND (KB%+1)DIV2=Y% PRINT'"* HALF WAY * ":PRINT:VDU9; 1800 NEXTY% 1810 REM"** 1820 LT%=LA%+LB% 1830 DT%=DA%+DB%:DE%=LT%-DT%+Z%:REM dec 1840 PROCzeroT 1850 TM=TIME/100:MN=(TM)DIV60 1860 IFTM>60 VDU7 1870 PROCanswer:VDU14 1880 G$=GET$ 1890 IFG$="N" RUN 1900 IFG$="D" PROCdisplay 1910 IFG$="C" PROCcommas 1920 IFG$="P" GOTO3080 1930 GOTO1880 1940 "** 1950 DEFPROCcarryA 1960 T$(KZ%-1)=STR$(VAL(T$(KZ%-1))+1) 1970 IFLEN(T$(KZ%-1))<4 T$(KZ%-1)="0"+T$(KZ%-1):GOTO1970 1980 T$=RIGHT$(T$,8) 1990 ENDPROC 2000 "** 2010 DEFPROCcarryB 2020 T$(KZ%-Q%)=RIGHT$(T$(KZ%-Q%),4) 2030 T$(KZ%-Q%-1)=STR$(VAL(T$(KZ%-Q%-1))+1) 2040 IFLEN(T$(KZ%-Q%-1))<4 T$(KZ%-Q%-1)="0"+T$(KZ%-Q%-1):GOTO2040 2050 Q%=Q%+1 2060 ENDPROC 2070 "** 2080 DEFPROCzeroT 2090 C%=1:N%=0:REM lead 0 2100 IFLEFT$(T$(C%),1)<>"0" OR N%=DT% THEN2150 2110 N%=N%+1 2120 T$(C%)=RIGHT$(T$(C%),LEN(T$(C%))-1) 2130 IFT$(C%)="" C%=C%+1 2140 GOTO2100 2150 LT%=LT%-N%:DT%=DT%-N%:REM dec for print 2160 C%=KC%:N%=0:REM trail 0 2170 IFRIGHT$(T$(C%),1)<>"0" OR N%=DE% THEN2220 2180 N%=N%+1 2190 T$(C%)=LEFT$(T$(C%),LEN(T$(C%))-1) 2200 IFT$(C%)="" C%=C%-1 2210 GOTO2170 2220 LT%=LT%-N%+Z% 2230 ENDPROC 2240 "** 2250 DEFPROCanswer 2260 PRINT'"ANSWER:" 2270 IFDT%=0 PRINT"0"; 2280 C%=0 2290 FORN%=1TOKC% 2300 IFT$(N%)="" THEN2360 2310 FORM%=1TOLEN(T$(N%)) 2320 IFC%=DT% PRINT"."; 2330 PRINTMID$(T$(N%),M%,1); 2340 C%=C%+1 2350 NEXT 2360 NEXT 2370 PRINT'CR$;LT%;DG$ 2380 PRINT'"Time=";MN;"min ";INT((TM-MN*60)*100)/100;"sec " 2390 VDU3 2400 PROCprompts 2410 ENDPROC 2420 "** 2430 DEFPROCdisplay 2440 CLS:PRINTMXP$ 2450 PRINT'"FIRST NUMBER:" 2460 PROCfirst 2470 PRINT"SECOND NUMBER:" 2480 PROCsecond 2490 PROCanswer 2500 ENDPROC 2510 "** 2520 DEFPROCfirst 2530 C%=0:K%=4 2540 IFDA%=0 PRINT"0"; 2550 FORN%=1TOKA% 2560 IFN%=KA% K%=K%-ZA% 2570 FORM%=1TOK% 2580 IFC%=DA% PRINT"."; 2590 PRINTMID$(A$(N%),M%,1); 2600 C%=C%+1 2610 NEXT:NEXT 2620 PRINT'CR$;LA%;DG$:PRINT 2630 ENDPROC 2640 "** 2650 DEFPROCsecond 2660 C%=0:K%=4 2670 IFDB%=0 PRINT"0"; 2680 FORN%=1TOKB% 2690 IFN%=KB% K%=K%-ZB% 2700 FORM%=1TOK% 2710 IFC%=DB% PRINT"."; 2720 PRINTMID$(B$(N%),M%,1); 2730 C%=C%+1 2740 NEXT:NEXT 2750 PRINT'CR$;LB%;DG$ 2760 ENDPROC 2770 "** 2780 DEFPROCcommas 2790 CLS:PRINTMXP$ 2800 PRINT'" ANSWER:" 2810 C%=2-(DT%)MOD3:CK%=C%:D%=DT%+C%:CO%=0:CR%=131 2820 GOSUB3000 2830 IFDT%=0 PRINT"0.";:CO%=CO%+3:CR%=129 2840 FORN%=1TOKC% 2850 IFT$(N%)=""THEN2950 2860 FORM%=1TOLEN(T$(N%)) 2870 C%=C%+1 2880 PRINTMID$(T$(N%),M%,1); 2890 GOSUB3000 2900 IFC%MOD3<>2 OR C%-CK%=LT% THEN2940 2910 IFC%<>D% PRINT","; 2920 IFC%=D% PRINT".";:CO%=CO%+1:CR%=129 2930 GOSUB3000 2940 NEXT 2950 NEXT 2960 PRINT'CR$;LT%;DG$ 2970 VDU3 2980 PROCprompts 2990 ENDPROC 3000 IFCO%MOD39=0 PRINTCHR$(CR%); 3010 CO%=CO%+1 3020 RETURN 3030 "** 3040 DEFPROCprompts 3050 PRINT'"PRESS:Nfor new run."SPC(25)"Dtodisplay numbers and answer. (use SHIFT to scroll)"SPC(16)"Cfor commas in answer."SPC(16)"Pfor print options.":PRINTSPC(8); 3060 ENDPROC 3070 REM"Print: 3080 CLS:PRINTMXP$:PRINT'"PRINTER ON:"; 3090 IFP%=0 PRINTTAB(20)"Parallel Printer:"ELSEPRINTTAB(17)"Serial Printer/1200:" 3100 PRINT'"PRESS:Dto print numbers and answer. Cto print answer with commas. Rto return."SPC(27)"T to toggle parallel/serial.":PRINTSPC(8); 3110 G$=GET$ 3120 IFG$<>"D" AND G$<>"C" THEN3170 3130 VDU2:VDU15 3140 IFG$="D" PROCdisplay 3150 IFG$="C" PROCcommas 3160 VDU14:GOTO1880 3170 IFG$="R" CLS:PRINTMXP$:PROCprompts:GOTO1880 3180 IFG$<>"T" THEN3110 3190 IFP%=0 P%=1ELSEP%=0 3200 IFP%=1THEN*FX5,2 3210 IFP%=1THEN*FX8,4 3220 IFP%=0THEN*FX5,1 3230 *FX6,10 3240 GOTO3080 3250 REM"Escape: 3260 VDU3:PRINT'"";STRING$(39,"`") 3270 VDU11:PRINT"PRESS:Eto Escape."SPC(27)" Nfor new run.":PRINTSPC(8); 3280 G$=GET$:IFG$="E" PRINT'"";STRING$(39,"`");:VDU14:END 3290 IFG$="N" RUN ELSE3280