Rezolvare completă PbInfo #1678 modifMat

Cerința

Se citeşte din fişierul de intrare o matrice pătratică A cu n linii şi n coloane conţinând numere naturale. Scrieţi un program care modifică matricea A în modul următor:

I. interschimbă elementele matricei din triunghiul superior cu cele din triunghiul inferior al matricei

II. după aceea interschimbă elementele superprime distincte, care apar în triunghiul din dreapta cu cel din triunghiul din stânga al matricei (ambele elemente trebuie să fie superprime);

Un număr natural n se numeşte superprim dacă printre numerele care pot fi obţinute mutând, pe rând, prima cifră a numărului n şi a celor obţinute pe parcurs, pe ultima poziţie, există cel puţin un număr prim. De exemplu 124 este “superprim” deoarece dintre numerele 241, 412 şi 124, numărul 241 este prim. 15 nu este “superprim” deoarece nici 51, nici 15 nu sunt numere prime.

Date de intrare

Fișierul de intrare matrice.in conține pe prima linie numărul n, iar pe următoarele n linii câte n numere naturale reprezentând elementele matricei.

Date de ieșire

Fișierul de ieșire matrice.out va conține matricea modificată, câte o linie a matricei pe o linie a fişierului, fiecare element al matricei fiind separat prin câte un spaţiu.

Restricții și precizări

  • 3 ≤ n ≤ 50
  • 1 ≤ ai,j ≤ 2000
  • Nu se iau în considerare elementele de pe cele două diagonale.

Exemplu:

matrice.in

4
1 3 4 2
8 1 2 7
124 2 1 32
2 5 6 1

matrice.out

1 5 6 2
8 1 2 7
32 2 1 124
2 3 4 1

Explicații

Pentru \(\scriptsize n = 4\) şi matricea \(\scriptsize A = \begin{bmatrix}
1 & 3 & 4 & 2\\
8 & 1 & 2 & 7\\
124 & 2 & 1 & 32\\
2 & 5 & 6 & 1
\end{bmatrix}\), după aplicarea interschimbării de la punctul I. se obţine matricea \(\scriptsize A = \begin{bmatrix}
1 & 5 & 6 & 2\\
8 & 1 & 2 & 7\\
124 & 2 & 1 & 32\\
2 & 3 & 4 & 1
\end{bmatrix}\), apoi aplicând modificarea de la punctul II. se obţine \(\scriptsize A = \begin{bmatrix}
1 & 5 & 6 & 2\\
8 & 1 & 2 & 7\\
32 & 2 & 1 & 124\\
2 & 3 & 4 & 1
\end{bmatrix}\) (matricea afişată). Observăm că elementele \(\scriptsize 8\) şi \(\scriptsize 7\) nu se schimbă, deoarece \(\scriptsize 8\) nu este superprim, dar \(\scriptsize 124\) şi \(\scriptsize 32\) se schimbă între ele deoarece ambele sunt superprime.

În figura de mai jos, triunghiul superior al matricei este cel marcat cu 1, triunghiul inferior este cel marcat cu 3, triunghiul din stânga este cel marcat cu 2, iar triunghiul din dreapta este cel marcat cu 4.

Pentru \(\scriptsize n = 4\), triunghiul superior al matricei \(\scriptsize A\) conţine elementele \(\scriptsize a_{12}\) şi \(\scriptsize a_{13}\), triunghiul inferior conţine elementele \(\scriptsize a_{42}\) şi \(\scriptsize a_{43}\), triunghiul stâng conţine elementele \(\scriptsize a_{21}\) şi \(\scriptsize a_{31}\), iar triunghiul drept conţine elementele \(\scriptsize a_{24}\) şi \(\scriptsize a_{34}\).

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema modifMat:

#include <stdio.h>

typedef int matrice[55][55];

//-----------------------------------------------------------------------------------------
// citirea matricei din fisierul de intrare
void citire_matrice(matrice A, int *numar_linii, FILE **fisier) {
    fscanf(*fisier, "%d", &(*numar_linii));

    int i, j;
    for(i = 1; i <= *numar_linii; i++)
        for(j = 1; j <= *numar_linii; j++)
            fscanf(*fisier, "%d", &A[i][j]);
}

//-----------------------------------------------------------------------------------------
// afisarea matricei in fisierul de isire
void afisare_matrice(matrice A, int numar_linii, FILE **fisier) {
    int i, j;
    for(i = 1; i <= numar_linii; i++) {
        for(j = 1; j <= numar_linii; j++)
            fprintf(*fisier, "%d ", A[i][j]);
        fprintf(*fisier, "\n");
    }
}

//-----------------------------------------------------------------------------------------
// functie care determina daca un numar este prim
int prim(int numar) {
    if(numar % 2 == 0 || numar < 3)
        return (numar == 2);
    int d;
    for(d = 3; d * d <= numar; d += 2)
        if(numar % d == 0)
            return 0;
    return 1;
}

//-----------------------------------------------------------------------------------------
// functie care determina daca un numar este superprim
int superprim(int numar) {
    int p = 1, aux = numar, copie = numar;
    while(copie > 9) {
        p *= 10;
        copie /= 10;
    }

    do {
        if(prim(aux))
            return 1;
        aux = (aux % p) * 10 + aux / p;
    }while(aux != numar);
    
    return 0;
}

//-----------------------------------------------------------------------------------------
// functie care interschimba elementele A[i][j] cu A[k][p]
void interschimbare(matrice A, int i, int j, int k, int p) {
    int aux = A[i][j];
    A[i][j] = A[k][p];
    A[k][p] = aux;
}

//-----------------------------------------------------------------------------------------
// functie care interschimba elementele din triunghiul superior si cel inferior
void interschimbare_triunghi_superior_inferior(matrice A, int numar_linii) {
    int i, j;
    for(i = 1; i <= numar_linii / 2; i++)
        for(j = i + 1; j + i <= numar_linii; j++)
            interschimbare(A, i, j, numar_linii - i + 1, j);
}

//-----------------------------------------------------------------------------------------
// functie care interschimba elementele superprime din triunghiul din dreapta si cel din stanga
void interschimbare_superprime(matrice A, int numar_linii) {
    int i, j;
    for(j = 1; j <= numar_linii / 2; j++)
        for(i = j + 1; i + j <= numar_linii; i++)
            if(superprim(A[i][j]) && superprim(A[i][numar_linii - j + 1]))
                interschimbare(A, i, j, i, numar_linii - j + 1);
}


int main() {
    FILE *fin = fopen("matrice.in", "r");
    FILE *fout = fopen("matrice.out", "w");

    matrice A;
    int numar_linii;

    citire_matrice(A, &numar_linii, &fin);
    interschimbare_triunghi_superior_inferior(A, numar_linii);
    interschimbare_superprime(A, numar_linii);

    afisare_matrice(A, numar_linii, &fout);

    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #1678 modifMat

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #1678 modifMat de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!