100 REM ************************ 110 REM 120 REM FAKULTAETSBERECHNUNG 130 REM 140 REM VON C.P.HUGELMANN 150 REM 160 REM ************************ 170 REM PROGRAMMPARAMETER 180 FM=100000:NZ%=5:NS%=7180 190 PI=1314 : PZ=1329 200 REM EINGABE DER FAKULTAET 210 GOSUB 1000 220 REM BERECHNUNG DER ZIFFERNANZAHL 230 GOSUB 1100 240 REM SPEICHERBEDARFABSCHAETZUNG 250 GOSUB 1300 260 REM ABSCHAETZUNG DER RECHENZEIT 270 GOSUB 1400 280 REM AUSFUEHREN ? 290 GOSUB 1500 300 REM INITIALISIERUNG 310 TI$="000000" : TA=TI 320 ML%=1 330 DIM M1(ND%) 340 M1(1)=1 350 PRINT"[147]" 360 REM BILDSCHIRM GANZ DUNKEL ? 400 REM BERECHNUNG 410 FOR I=1 TO FF% 420 UE=0 430 REM GOSUB 1600 FUER DIAGNOSE 440 FOR J=1 TO ML% 450 ZZ=M1(J)*I+UE 460 UF=INT(ZZ/FM) 470 M1(J)=ZZ-UF*FM 480 UE=UF 490 NEXT 500 IF UE=0 THEN 530 510 ML%=ML%+1 520 M1(ML%)=UE 530 NEXT 600 REM NACHBEREITUNG 610 TA=(TI-TA)/60 620 AU%=0 900 REM VERTEILER 910 GOSUB 1700 999 END 1000 PRINT"[147]" 1010 PRINT" " 1020 PRINT"WELCHE FAKULTAET MOECHTEN SIE BERECHNEN"; 1030 INPUT A$ 1040 IF A$="0" THEN FF%=0 : GOTO 1070 1050 FF%=VAL(A$) 1060 IF FF%=0 THEN PRINT"GEBEN SIE BITTE NUR EINE ZAHL GROESSER 0 EIN":GOTO 1010 1070 A$=STR$(FF%) 1080 LL%=LEN(A$) 1090 FS$=RIGHT$(A$,LL%)+"!" 1099 RETURN 1100 IF FF%=0 OR FF%=1 THEN FZ=1 : GOTO 1180 1110 LX=LOG(SQR(6.283185307179)) 1120 LY=(FF%+0.5)*LOG(FF%)-FF%+LX 1130 LZ=LOG(10.) 1140 FZ=INT(LY/LZ)+1 1150 IF FZ=1 THEN 1180 1160 PRINT FS$;" HAT ";FZ;" ZIFFERN" 1170 GOTO 1199 1180 PRINT FF%;"! HAT EINE ZIFFER" 1199 REM RETURN FALLS 0EN UNINTERESSANT 1200 LL%=FF% 1210 L5%=0 1220 M5%=INT(LL%*0.2+0.1) 1230 IF LL%>=5 THEN:L5%=L5%+M5%:LL%=M5%:GOTO 1220 1240 IF L5%=0 THEN 1299 1250 IF L5%=1 THEN 1280 1260 PRINT" ...DAVON ";L5%;" NULLEN AM ENDE" 1270 RETURN 1280 PRINT" ...DAVON EINE NULL AM ENDE" 1299 RETURN 1300 ND%=INT((FZ+NZ%-.5)/NZ%) 1310 IF ND%<=NS% THEN 1399 1315 PRINT" " 1320 PRINT" " 1325 PRINT" LEIDER REICHT DER SPEICHER-" 1330 PRINT" BEDARF FUER EINE BERECHNUNG" 1335 PRINT" SO NICHT AUS. WEITER UEBER " 1340 PRINT" 10000! KOMMT MAN NUR, WENN " 1345 PRINT" MAN JE 4 ZIFFERN IN EINEM " 1350 PRINT" INTEGERFELD SPEICHERT(NZ%=4" 1355 PRINT" ND%<=NS%=18000,DIM M1%(NS%))" 1360 PRINT" DIE ZEITBERECHNUNG STIMMT " 1365 PRINT" DANN SO NICHT MEHR : " 1370 PRINT" " 1380 AU%=-1 1399 RETURN 1400 IF FF%>99 THEN 1440 1410 A=0.10633 : B=1.5192E-4 : C=3.2094E-3 : D=1.6457E-5 : E=6.18974E-2 1420 SE=((D*FF%+C)*FF%+B)*FF%+A+E*LOG(FF%+1) 1430 GOTO 1480 1440 A=-426.652 : B=-1.64185 : C=8.36252E-3 : D=4.6302E-7 : E=119.972 1450 SE=INT(((D*FF%+C)*FF%+B)*FF%+A+E*LOG(FF%)+.5) 1480 PRINT"DIE BERECHNUNG DAUERT ETWA" 1490 PRINT SE;" SEKUNDEN" 1499 RETURN 1500 PRINT" " 1510 IF AU%>=0 THEN PRINT" AUSFUEHREN (J/N)":GOTO1530 1520 PRINT"WEITER MIT " 1530 GET A$ : IF A$="" THEN 1530 1540 IF AU%<0 THEN 900 1570 IF LEFT$(A$,1)="N" THEN AU%=-1 : GOTO 900 1580 AU%=1 1599 RETURN 1600 POKE PI-3,9:POKE PI-2,61 1610 A$=STR$(VAL(STR$(I))) 1620 FOR K=1 TO LEN(A$) 1630 POKE PI+K,ASC(MID$(A$,K,1)) 1640 NEXT 1650 POKE PZ+2,19:POKE PZ+3,5:POKE PZ+4,3 1660 A$=STR$(INT((TI-TA)/60)) 1670 FOR K=1 TO LEN(A$) 1680 POKE PZ-LEN(A$)+K,ASC(MID$(A$,K,1)) 1690 NEXT 1699 RETURN 1700 PRINT"[147]" 1710 PRINT" " 1720 PRINT"NEUE FAKULTAETSBERECHNUNG --> 1" 1730 PRINT"AUFHOEREN --> 2" 1740 IF AU%<0 THEN GOTO 1800 1750 PRINT"LAENGE,ZEIT --> 3" 1760 PRINT"AUSGABE BILDSCHIRM --> 4" 1770 PRINT"AUSGABE FLOPPY --> 5" 1775 GOTO 1800 1780 PRINT"AUSGABE DRUCKER --> 6" 1800 GET A$ :IF A$="" THEN 1800 1810 LL%=VAL(A$) 1815 PRINT"[147]" 1820 ON LL% GOTO 1840,999,1900,1850,1930,2000 1830 PRINT"EINGABEFEHLER !":GOTO 1710 1840 RUN 1850 PRINT FS$;" = ";RIGHT$(STR$(M1(ML%)),NZ%); 1860 IF ML%=1 THEN 1895 1870 FOR K=ML%-1 TO 1 STEP -1 1880 PRINT RIGHT$(STR$(FM+M1(K)),NZ%); 1890 NEXT 1895 GET A$ : IF A$="" THEN 1895 1899 GOTO 1700 1900 REM ZEITVERGLEICH 1910 GOSUB 1150 1920 PRINT "ZUR BERECHNUNG WURDEN BENOETIGT:" 1921 PRINT TA;" SEKUNDEN" 1925 PRINT "(GESCHAETZT:";SE;" )" 1928 GET A$ :IF A$="" THEN 1928 1929 GOTO 1700 1930 REM FLOPPY 1940 PRINT"FLOPPY EINGESCHALTET ?" 1950 GET A$ :IF A$="" THEN 1950 1960 OPEN 11,8,11,"0:"+FS$+",S,W" 1970 ZZ$="*** "+FS$+" MIT "+STR$(FZ)+"ZIFFERN ***" 1971 PRINT#11,ZZ$ 1980 ZZ$="*** BERECHNET IN "+STR$(TA)+" SEKUNDEN ***" 1981 PRINT#11,ZZ$ 1990 FOR K=ML% TO 1 STEP -1 1991 PRINT#11,RIGHT$(STR$(FM+M1(K)),NZ%); 1992 NEXT 1993 PRINT#11,"*" 1997 CLOSE 11 1998 GOTO 1710 1999 RETURN