label Referate autorenew 2025-09-29, 16:56 history_edu virgil
Construcia unui ptrat magic imparProblema:S se construiasc un ptrat magic de dimensiune n ( cu n impar), adic o matrice cu n linii si n coloane avnd ca elemente numerele naturale 1, 2, ..., n^2 astfel nct sumele elementelor pe linii, pe coloane si pe cele doua diagonale sa fie identice.Introducere:Un ptrat magic const dintr-un tablou de numere aranjate n forma unui ptrat, astfel nct sumele elementelor din fiecare linie, coloan i din cele dou diagonale s fie identice; valoarea sumei se numete numr magic. Un ptrat magic este de ordin n dac pe o latur a sa sunt aezate n numere, iar n componena sa intr numerele 1, 2, 3, n2; atunci numrul magic poate fi calculat cu formula: numr magic = n(n2+1)/2.Exist un singur ptrat magic de ordinul 3 (cu toate c prin rotaii i simetrii pot fi obinute 8 astfel de ptrate):438951276Ptratele magice de ordin 4 sunt n numr de 880 (7040 dac sunt considerate i rotaiile i simetriile), iar numrul ptratelor magice de ordin 5 este de circa 13.000.000.Sunt cunoscute mai multe metode de obinere a ptratelor magice, ele diferind pentru ptratele de ordin par, respectiv impar.Metoda:O metod foarte simpl const n urmtoarele aciuni:Se plaseaz 1 n centrul ultimei coloane;Se merge n linie oblic, dreapta-jos, cu numrul urmtor; dac se iese din ptrat prin partea dreapt, se merge n partea opus, n stnga liniei unde trebuia depus numrul, iar dac se iese prin partea de jos a ptratului, se merge n partea de sus a coloanei unde trebuia depus numrul;Dup ce se completeaz un grup de n numere, se merge cu o csu spre stnga, pe aceeai linie, pentru a se repeta apoi pasul 2 i a genera urmtorul grup de n numere.Se obine n final urmtorul ptrat magic:11104231718126524251913712212014893221615Despre program:Programul permite 2 tipuri de afiare a ptratului magic:1.Direct programul afieaz ptratul chiar dac nu o s ncap pe ecran2.Pas cu pasdup fiecare numr afiat trebuie apsat o tastse vor afia numai ptratele cu n<15. Pentru n>15 afiarea se va face numai n mod 'Direct'Sursa programului:#include #include unsigned char m[200][200];int n;void af(){ for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) printf("%3d%c",m[i][j],j==n?'
':' ');}void mod_1(){ int i=n/2+1,j=1; for (int nr=1;nr<=n*n;nr++) { if (nr%n==1) {if (!(--j)) j=n;} else {if (++i==n+1) i=1; if (++j==n+1) j=1; } m[i][j]=(unsigned char)nr; } af();}void mod_2(){ if (n>17) { printf("Nu pot afisa pas cu pas patrate cu n>17.Il afisez normal...
"); mod_1(); return; } int poz=wherey()-1; int i=n/2+1,j=1; for (int nr=1;nr<=n*n;nr++) { if (nr%n==1) {if (!(--j)) j=n;} else {if (++i==n+1) i=1; if (++j==n+1) j=1; } gotoxy(j*4,poz+i); printf("%3d ",nr); getch(); } gotoxy(1,poz+n);}void main(void){ char c; do{ clrscr(); printf("N=");scanf("%d",&n);fflush(stdin); if (n%2) { puts("1. Direct 2. Pas cu pas"); printf("Alegeti modul de afisare al patratului (1/2):"); unsigned char k; scanf("%u",&k); if (k==1) mod_1(); else mod_2(); printf("
Acesta este patratul magic de ordin %d.",n); printf("
Numarul magic este %d.",n*(n*n+1)/2); } else printf("Ati introdus un numar par..."); printf("
Continuati? (d/n) ");c=getch(); }while (c!='n');}