9

From Algopedia
Jump to navigationJump to search

Teza

Nr.1

Subiectul I

Din fișierul pr1nr1.in se citesc n numere naturale cu cel mult 4 cifre (0 < n < 1.000.000).

  • a. Să se afișeze pe prima linie a fisierului pr1nr1.out, în ordine crescătoare, toate numerele cu exact 3 cifre care apar în fișierul inițial.
  • b. Să se afișeze pe linia a doua, în fișierul pr1nr1.out, numărul care apare de cele mai multe ori. Dacă sunt mai multe numere să se afișeze cel mai mare dintre acestea.

Rezolvare: Vom construi un vector de frecventa, unde v[i] va fi nr de aparitii ale lui i in sirul dat. Cum valorile din sir pot avea maxim 4 cifre, ultima casuta din acesta va fi 9999. Deci vom declara un vector de dimensiune 10000. Pentru rezolvarea punctului a, vom parcurge vectorul de frecventa de la pozitia 100 pana la 999 ( toate numerele de 3 cifre ) si le vom afisa numai daca v[i] e nenul ( i este insirul initial ). Pentru punctul b, vom afisa valoarea maxima din intregul vector de frecventa ( de la 0 la 9999) Iata implementarea acestei solutii:

#include <stdio.h>
#include <stdlib.h>
int v[10000];
int main(){
  int n, fmax, vmax, i, x;
  FILE *fin, *fout;
  fin = fopen( "pr1nr1.in", "r" );
  fout = fopen( "pr1nr1.out", "w" );
  //citim cele n valori si construim vectorul de frecventa
  fscanf( fin, "%d", &n );
  for( i = 0; i < n; i++ ){
    fscanf(fin, "%d", &x);
    v[x]++;
  }

  //a) afisam in ordine numerele de 3 cifre care apar in sir
  for( i = 100; i <= 999; i++ ){
    x = v[i];
    while( x-- )
      fprintf(fout, "%d ", i);
  }
  fprintf( fout, "\n" );
  //b) determinam valoarea maxima a frecventelor de aparitie si retinem valoare care are frecventa maxima
  fmax = v[0]; vmax = 0;
  for( i = 1; i <= 9999; i++ )
    if( v[i] >= fmax ){
      fmax = v[i];
      vmax = i;
    }
  fprintf( fout, "%d\n", vmax );
  fclose( fin );
  fclose( fout );
  return 0;
}

Subiectul II

Din fișierul pr2nr1.in se citesc n ( 0 < n < 100 ), numere naturale cu cel mult 14 cifre.

  • a. Să se sorteze crescator numerele si sa se afișeze pe prima linie a fișierulul pr2nr1.out numerele din sir in ordine crescatoare din prima jumatate a vectorului sortat, exclusiv elementul din mijloc, in caz ca sirul are numar impar de valori.
  • b. Pe a doua linie a aceluiasi fisier afisati cel mai mare divizor comun dintre suma elementelor din prima jumatate si a doua jumatate a vectorului sortat.

Rezolvare:

#include <stdio.h>

long long v[100], aux, s1, s2, r;

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

  int n, i, j;

  // citim elementele sirului si le vom pune intr-un vector v
  fscanf( fin, "%d", &n );
  for ( i = 0; i < n; i++ )
    fscanf( fin, "%lld", &v[i] );

  // sortam elementele vectorului v
  for ( i = 0; i < n-1; i++ )
    for ( j = i+1; j < n; j++ )
      if ( v[i] > v[j] ){
        aux = v[i];
        v[i] = v[j];
        v[j] = aux;
    }
  //afisam prima jumatate a vect sortat
  for ( i = 0; i < n/2; i++ )
    fprintf( fout, "%lld ", v[i] );
  fprintf( fout, "\n" );

  //calculam simultan cele doua sume
  s1 = s2 = 0;
  for ( i = 0; i < n / 2; i++ ){
    s1 += v[i];
    s2 += v[n-i-1];
  }
  //cmmdc intre s1 si s2
  while ( s2 ){
    r = s1 % s2;
    s1 = s2;
    s2 = r;
  }
  fprintf( fout, "%lld\n", s1 );
  return 0;
}

Subiectul III

Din fișierul pr3nr1.in se citesc, de pe prima linie 3 numere naturale nenule n, m, x, 1 < n, m < 100, iar de pe urmatoarele m linii se citesc câte n numere naturale cu cel mult 8 cifre, reprezentand elementele unei matrici. a. Afisati pe prima linie a fisierului pr3nr1.out linia si coloana primei aparitii a lui x in matrice. b. Afisati pe a doua linie a fisierului pr3nr1.out numarul de aparitii ale lui x in matrice.

Rezolvare:

#include <stdio.h>

int main(){
  int i, j, l, c, x, co, nr, ok;
  FILE *fin, *fout;
  fin = fopen( "pr3nr1.in", "r" );
  fout = fopen( "pr3nr1.out", "w" );
  fscanf( fin, "%d%d%d", &l, &c, &x );
  contor = 0;  //nr de aparitii
  for( i=1; i<=l; i++ )            //parcurgem intreaga matrice
    for( j=1; j<=c; j++ ){
      fscanf( fin, "%d", &nr );
      if( nr == x ){                //numaram de cate ori apare x in matrice
        contor++; 
        if( contor == 1 )            //daca suntem la prima aparitie           
          fprintf( fout, "%d %d\n", i, j ); //afisam coordonatele aparitiei respective 
      }  
   }
    
  fprintf( fout, "%d\n", contor );
  fclose( fin );
  fclose( fout );
  return 0;
}

Subiectul IV

Din fișierul pr4nr1.in se citesc, de pe prima linie un numar natural nenul n, 1<n<100. De pe urmatoarele n linii se citesc câte n numere naturale cu cel mult 8 cifre, reprezentant elementele unei matrice patratice.

  • a. Să se afiseze in pr4nr1.out pe prima linie suma elementelor de pe toate liniile care au ca prim element un numar prim .
  • b. Să se afiseze in pr4nr1.out pe a doua linie cate numere care au exact 3 cifre sunt in triunghiul de sub diagonala principala.

Rezolvare:

#include <stdio.h>
#include <stdlib.h>
long long suma;
int m[100][100];
int main(){
  int n, e, d, ok, i, j;
  FILE *fin, *fout;
  fin=fopen("pr4nr1.in", "r");
  fout=fopen("pr4nr1.out", "w");

  //citirea matricei
  fscanf(fin, "%d", &n);
  for( i = 0; i < n; i++ )
    for(j = 0; j < n; j++ )
      fscanf( fin, "%d", &m[i][j] );

  for( i = 0; i < n; i++){
    //verific ca primul elem de pe linia i, m[i][0],  e prim
    d = 2;
    while(d * d <= m[i][0] && m[i][0] % d )
      d++;

    //daca e prim adaugam toate elementele de pe linia i la suma
    if( d * d > m[i][0] && m[i][0] > 1 )
      for( j = 0; j < n; j++ )
        suma += m[i][j];
  }

  fprintf(fout, "%lld\n", suma);

  //parcurgerea triunghiului de sub diagonala principala
  suma = 0;
  for (i = 0; i < n; i++ )
    for (j = 0; j < i; j++ ){
      if ( m[i][j] >= 100 && m[i][j] <= 999 )
        suma++;
    }
  fprintf( fout, "%d\n", suma );

  fclose( fin );
  fclose( fout );
  return 0;
}