codice:
#include <iostream.h>
int MCD(int, int, int);
int mcm(int, int, int);
void fact(int, int*, int);
int main() {
int a,b,c;
bool is;
int co = 0;
cout << "Tre numeri interi:\n";
cin >> a;
cin >> b;
cin >> c;
int numfirst[5000];
for(int i = 2; i < 5000; i++) {
is = true;
for(int j = 2; j < i/2; j++)
if((i%j) == 0) is = false;
if(is)
numfirst[co] = i;
co++;
}
fact(a, numfirst, co);
fact(b, numfirst, co);
fact(c, numfirst, co);
cout << endl;
cout << "\nmcm(" << a << ", " << b << ", " << c << ")" << " = " << mcm(a, b, c) << endl;
cout << "MCD(" << a << ", " << b << ", " << c << ")" << " = " << MCD(a, b, c) << endl << endl;
cout << "Premi un tasto per uscire: ";
char exit;
cin >> exit;
return 0;
}
int mcm(int a, int b, int c) {
for(int mcm = 2; ; mcm++) {
if(mcm % a == 0 && mcm % b == 0 && mcm % c == 0) break;
}
return mcm;
}
int MCD(int a, int b, int c) {
int max;
if(a > b && a > c) max = a;
else if(b > a && b > c) max = b;
else if(c > a && c > b) max = c;
for(int MCD = max; ; MCD--) {
if(a % MCD == 0 && b % MCD == 0 && c % MCD == 0) break;
}
return MCD;
}
void fact(int num, int* numfirst, int co) {
cout << endl;
int now = num;
for(int n = 0; n <= co; ) {
if(now % numfirst[n] == 0) {
cout << endl << now << ":";
cout << numfirst[n] << "\r";
now /= numfirst[n];
n = 0;
}
else n++;
}
}
Non è commentato, se ti serve lo faccio.
codice:
100 'LABIRINT: crea un labirinto, e lo risolve
110 '
120 DEFINT A-Z 'Tutte variabili intere per velocit…
130 '
140 ' - Dichiarazioni e costanti -
150 '
160 SCR = 2 'Dati per SCREEN usato
170 DIMX = 640
180 DIMY = 200
190 NCASX = 30 'Numero caselle del labirinto
200 NCASY = 16
210 DIM L(NCASX, NCASY, 4)'4 connessioni per casella (a,s,b,d),+esplorata (0)
220 DIM SX(NCASX * NCASY)'Stack caselle, sovradimensionato per sicurezza
230 DIM SY(NCASX * NCASY)
240 DIM D(4) 'Direzioni possibili da una certa casella
250 DIM DX(4), DY(4)'Differenza in x ed y nella direzione indicata
260 DX(1) = 0: DY(1) = -1 'Verso l'alto
270 DX(2) = -1: DY(2) = 0 'Verso sinistra
280 DX(3) = 0: DY(3) = 1 'Verso il basso
290 DX(4) = 1: DY(4) = 0 'Verso destra
300 DIM DI(4) 'Direzione inversa
310 DI(1) = 3: DI(2) = 4: DI(3) = 1: DI(4) = 2
320 CR$ = CHR$(13) 'Return
330 '
340 ' - Main -
350 '
360 RANDOMIZE TIMER
370 KEY OFF: SCREEN SCR
380 FINITO = 0: WHILE NOT FINITO
390 CLS : LOCATE 1, 9: PRINT "- Labirinto ricorsivo -";
400 PRINT " di Giacomo Zorzi -";
410 GOSUB 540 'Calcola dimensioni e posizione labirinto
420 GOSUB 640 'Prepara array con bordo circostante
430 GOSUB 850 'Disegna reticolo iniziale
440 GOSUB 980 'Crea labirinto
450 GOSUB 1350 'E lo risolve
460 A$ = "Ho trovato l'uscita (Return per smettere, Spazio per un altro): "
470 GOSUB 1660: IF C$ = CR$ THEN FINITO = -1
480 WEND
490 SCREEN 0: CLS
500 END
510 '
520 ' - Calcola dimensioni caselle e posizione labirinto -
530 '
540 DCX = DIMX \ (NCASX + 2)'Dimensione X, bordi laterali pari a 2 caselle
550 DCY = (DIMY - 4 * (DIMY \ 25)) \ NCASY'Dimensione Y, con spazio per 4 linee
560 X0 = (DIMX - NCASX * DCX) \ 2'Posizione dell'angolo superiore sinistro
570 Y0 = 2 * (DIMY \ 25)
580 XENTRA = 1 + INT(NCASX * RND)'Posizione entrata
590 XESCE = 1 + INT(NCASX * RND)'E uscita
600 RETURN
610 '
620 ' - Prepara array L() inizializzato a zero, tranne i bordi -
630 '
640 FOR X = 1 TO NCASX 'Azzera tutti i collegamenti
650 FOR Y = 1 TO NCASY
660 FOR I = 0 TO 4 'Lo zero indica se Š stata esplorata
670 L(X, Y, I) = 0
680 NEXT I
690 NEXT Y
700 NEXT X
710 Y = 1 'Bordo superiore
720 FOR X = 1 TO NCASX: L(X, Y, 1) = -1: NEXT X'Non si passa verso l'alto
730 Y = NCASY 'Bordo inferiore
740 FOR X = 1 TO NCASX: L(X, Y, 3) = -1: NEXT X'Non si passa verso il basso
750 X = 1 'Bordo sinistro
760 FOR Y = 1 TO NCASY: L(X, Y, 2) = -1: NEXT Y'Non si passa verso sinistra
770 X = NCASX 'Bordo destro
780 FOR Y = 1 TO NCASY: L(X, Y, 4) = -1: NEXT Y'Non si passa verso destra
790 L(XENTRA, NCASY, 3) = -2'Entrata
800 L(XESCE, 1, 1) = -3'E uscita
810 RETURN
820 '
830 ' - Disegna reticolo iniziale -
840 '
850 FOR X = X0 TO X0 + DCX * NCASX STEP DCX'Linee verticali
860 LINE (X, Y0)-(X, Y0 + NCASY * DCY)
870 NEXT X
880 FOR Y = Y0 TO Y0 + DCY * NCASY STEP DCY'Linee orizzontali
890 LINE (X0, Y)-(X0 + NCASX * DCX, Y)
900 NEXT Y
910 Y = Y0 + NCASY * DCY'Aggiunge entrata e uscita
920 LINE (X0 + (XENTRA - 1) * DCX + 1, Y)-STEP(DCX - 2, 0), 0'Con una linea nera
930 LINE (X0 + (XESCE - 1) * DCX + 1, Y0)-STEP(DCX - 2, 0), 0
940 RETURN
950 '
960 ' - Crea labirinto -
970 '
980 A$ = "Premi Return per creare un labirinto: ": GOSUB 1660
990 X = XENTRA: Y = NCASY 'Parte dall'entrata
1000 LIV = 0 'Contatore di livello per stack
1010 FATTO = 0: WHILE NOT FATTO 'Ciclo pseudo-ricorsivo
1020 L(X, Y, 0) = 1'La casella corrente Š gi… stata esplorata
1030 ND = 0 'Prepara array D() con le ND direzioni possibili
1040 FOR I = 1 TO 4
1050 IF L(X, Y, I) <> 0 GOTO 1070'Direzione gi… collegata
1060 IF L(X + DX(I), Y + DY(I), 0) = 0 THEN ND = ND + 1: D(ND) = I'Inesplorata
1070 NEXT I
1080 IF ND = 0 GOTO 1180 'Esegue linee seguenti se ci sono direzioni libere
1090 D = D(1 + INT(ND * RND))'Sceglie una direzione a caso tra quelle libere
1100 L(X, Y, D) = 1'Si collega con la casella adiacente
1110 AX = X + DX(D): AY = Y + DY(D)'Di cui calcola le coordinate
1120 L(AX, AY, DI(D)) = 1'E la collega con s‚ stessa
1130 GOSUB 1260 'Abbatte la parete
1140 LIV = LIV + 1'Salva nello stack la casella corrente
1150 SX(LIV) = X: SY(LIV) = Y
1160 X = AX: Y = AY 'Si sposta sulla casella adiacente
1170 GOTO 1210 'Esegue linee seguenti se non ci sono direzioni libere
1180 X = SX(LIV): Y = SY(LIV) 'Riprende casella precedente dallo stack
1190 LIV = LIV - 1
1200 IF LIV = -1 THEN FATTO = -1'Esaurito lo stack, il labirinto Š finito
1210 WEND
1220 RETURN
1230 '
1240 ' - Abbatte visivamente una parete dalla cella X,Y nella direzione D -
1250 '
1260 XC = X0 + (X - 1) * DCX: YC = Y0 + (Y - 1) * DCY'Angolo superiore sinistro cella
1270 IF D = 1 THEN LINE (XC + 1, YC)-STEP(DCX - 2, 0), 0
1280 IF D = 2 THEN LINE (XC, YC + 1)-STEP(0, DCY - 2), 0
1290 IF D = 3 THEN LINE (XC + 1, YC + DCY)-STEP(DCX - 2, 0), 0
1300 IF D = 4 THEN LINE (XC + DCX, YC + 1)-STEP(0, DCY - 2), 0
1310 RETURN
1320 '
1330 ' - Risolve labirinto -
1340 '
1350 A$ = "Premi Return per risolverlo, Spazio se lo vuoi al rallentatore: "
1360 GOSUB 1660: LENTO = (C$ = " ")'Attiva rallentatore se battuto spazio
1370 X = XENTRA: Y = NCASY 'Parte dall'entrata
1380 LIV = 0 'Contatore di livello per stack
1390 RISOLTO = 0: WHILE NOT RISOLTO 'Ciclo pseudo-ricorsivo
1400 L(X, Y, 0) = 2'La casella corrente Š gi… stata esplorata
1410 PSET (X0 + X * DCX - DCX \ 2, Y0 + Y * DCY - DCY \ 2)'La marca con un puntino
1420 IF LENTO THEN PLAY "p16" 'Ritardo se va al rallentatore
1430 ND = 0 'Prepara array D() con le ND direzioni possibili
1440 FOR I = 1 TO 4
1450 C = L(X, Y, I)'Collegamento nella direzione data
1460 IF C = -3 THEN RISOLTO = -1: I = 5: GOTO 1490'Ha trovato l'uscita
1470 IF C <> 1 GOTO 1490'Direzione non valida
1480 IF L(X + DX(I), Y + DY(I), 0) = 1 THEN ND = ND + 1: D(ND) = I'Inesplorata
1490 NEXT I
1500 IF RISOLTO GOTO 1610 'Se ha trovato l'uscita, ha finito
1510 IF ND = 0 GOTO 1580 'Esegue linee seguenti se ha direzioni libere
1520 D = D(1 + INT(ND * RND))'Sceglie direzione a caso tra quelle libere
1530 AX = X + DX(D): AY = Y + DY(D)'Di cui calcola le coordinate
1540 LIV = LIV + 1'Salva nello stack la casella corrente
1550 SX(LIV) = X: SY(LIV) = Y
1560 X = AX: Y = AY 'Si sposta sulla casella adiacente
1570 GOTO 1610 'Esegue linee seguenti se non ci sono direzioni libere
1580 PRESET (X0 + X * DCX - DCX \ 2, Y0 + Y * DCY - DCY \ 2)'Toglie il puntino
1590 X = SX(LIV): Y = SY(LIV) 'Riprende casella precedente dallo stack
1600 LIV = LIV - 1
1610 WEND
1620 RETURN
1630 '
1640 ' - Messaggio A$ sull'ultima linea, aspetta Return o spazio in C$ -
1650 '
1660 LOCATE 24, 4: PRINT A$;
1670 WHILE INKEY$ <> "": WEND'Pulisce buffer di tastiera
1680 LOCATE , , 1'Mostra cursore utente
1690 OK = 0: WHILE NOT OK
1700 C$ = INPUT$(1)
1710 IF C$ = CR$ OR C$ = " " THEN OK = -1 ELSE BEEP
1720 WEND
1730 LOCATE , , 0'Nasconde cursore utente
1740 LOCATE 24, 1: PRINT SPACE$(79); 'Ripulisce la linea
1750 RETURN