9
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;
}