Sesiunea iulie
Subiectul I
a)
#include <iostream>
using namespace std;
int maxc(int m, int a[100][200], int c)
{
int i,max=a[0][c];
for(i=0;i<m;i++)
if(max<a[i][c])
max=a[i][c];
return max;
}
int minc(int m, int a[100][200], int c)
{
int i,min=a[0][c];
for(i=0;i<m;i++)
if(min>a[i][c])
min=a[i][c];
return min;
}
int maxl(int n, int a[100][200], int l)
{
int j,max=a[l][0];
for(j=0;j<n;j++)
if(max<a[l][j])
max=a[l][j];
return max;
}
int minl(int n, int a[100][200], int l)
{
int j,min=a[l][0];
for(j=0;j<n;j++)
if(min>a[l][j])
min=a[l][j];
return min;
}
int sa(int m,int n, int a[100][200])
{
int i,j,s=0;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if( ( a[i][j]==maxc(m,a,j)&&a[i][j]==minl(n,a,i) ) || ( a[i][j]==minc(m,a,j)&&a[i][j]==maxl(n,a,i) ) )
s++;
return s;
}
int main()
{
cout << "Hello world!" << endl;
int m,n,i,j;
cout<<"Numar linii= ";cin>>m;
cout<<"Numar coloane= ";cin>>n;
int a[100][200];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
cout<<"Numarul de elemente 'sa' este "<<sa(m,n,a);
return 0;
}
b)
#include <iostream>
#include <cmath>
using namespace std;
int nrcifre(int n)
{
int s=0;
while(n)
{
n=n/10;
s++;
}
return s;
}
long fact(long n)
{
long i,f=1;
for(i=2;i<=n;i++)
f=f*i;
return f;
}
int nr(int n)
{
int aux=0,i,m;
m=pow(10,nrcifre(n)-1);
aux=n%m;
m=n/pow(10,nrcifre(n)-1);
aux=aux*10+m;
return aux;
}
int cifre(int n)
{
int aux,aux2;
long t;
t=fact(nrcifre(n))-1;
aux=nr(n);
aux2=n;
while(t)
{
if(aux2<aux)
aux2=aux;
aux=nr(aux);
t--;
}
return aux2;
}
int main()
{
cout << "Hello world!" << endl;
int n;
cout<<"n=";cin>>n;
cout<<cifre(n);
return 0;
}
c)
#include <iostream>
using namespace std;
int pozc1(int X[100], int n, int v)
{
int i=0;
while(i<n&&X[i]<v)
i++;
if(i<n&&X[i]==v)
return i;
else
return -1;
}
int cautbin(int p,int u,int X[100],int v)
{
int m;
if(p>u)
m=-1;
else
{ m=(p+u)/2;
if(X[m]==v)
return m;
else
if(X[m]>v)
cautbin(p,m-1,X,v);
else
cautbin(m+1,u,X,v);
}
}
int pozc2(int X[100], int n, int v)
{
int p=0,u=n-1,m;
m=cautbin(p,u,X,v);
return m;
}
int main()
{
cout << "Hello world!" << endl;
int n,i,a[100],v;
cout<<"n=";cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
cout<<"v=";cin>>v;
cout<<pozc1(a,n,v);
cout<<endl<<pozc2(a,n,v);
return 0;
}
Subiectul II
a)
F(n,k) reprezinta suma in ordine descrescatoare de la n la k: n+(n-1)+(n-2)+...+k;
Astfel, F(98,1) reprezinta suma 98+97+...+1;
Suma 1+2+...+98 se poate calcula cu formula n*(n+1)/2
b)
O solutie ar fi n=75 si k=1
Suma 1+2+...+75=75*(75+1)/2=2850
c)
F(n,k) calculeaza suma numerelor de la k la n: k+(k+1)+(k+2)+...+n
Subiectul III
#include <iostream> // Inceput program.
#include <cmath>
using namespace std;
int prim(int n) // Cu aceasta functie verificam daca un numar este prim.
{
int s=0,i; // s reprezinta numarul de divizori ai numarului n.
for(i=1;i<=n;i++)
if(n%i==0) // Daca restul impartirii lui n la i este 0 atunci inseamna ca i este divizor.
s++; // Astfel numarul de divizori creste de fiecare data cand i este divizor.
if(s==2) // Un numar este prim daca numarul de divizori ai acestuia este 2.
return 1; // Returnam valoarea 1 in cazul in care numarul n este prim.
else
return 0; // Returnam valoarea 0 in caz ca numarul n nu este prim.
}
int nrcifre(int n) // Cu aceasta functie calculam numarul de cifre ale numarului n.
{
int s=0; // Cu ajutorul variabilei s calculam numarul de cifre.
while(n) // Cat timp partea intrega a numarului n este diferita de 0, urmatoarea secventa se va repeta.
{
n=n/10; // n ia valoarea partii intregi al calculului n/10.
s++; // Dupa fiecare impartire a lui n, valoarea numarului de cifre, calculat prin s, creste.
}
return s; // Returnam numarul de cifre prin variabila s.
}
int magic(int n) // Cu aceasta functie verificam daca un numar este magic.
{
int i,p=1,m; // Variabila p este o variabila de control. Initial numarul n este considerat a fi magic, astfel, variabila p are valorea 1.
if(prim(n)==0 || prim(n/pow(10,nrcifre(n)-1))==0 ) // Verificam daca numarul n si prima sa cifra sunt numere prime.
p=0; // Daca numerele nu sunt prime, valoarea lui p devine 0. Valoarea 0 semnifica faptul ca numarul nu este magic.
for(i=1;i<nrcifre(n);i++) // Aici se verifica daca sufixele lui n sunt numere prime. Variabila m este o variabila ajutatoare.
{
m=pow(10,i); // m ia valoarea numarului 10 la puterea i.
if(prim(n%m)==0) // Un sufix al numarului n este restul impartirii lui n la m. Se verifica daca acest sufix este prim.
p=0; // In cazul in care sufixul nu a fost prim, atunci valoarea lui p devine 0.
}
return p; // Se returneaza valoarea lui p, 1, in caz ca numarul este magic, 0, in caz ca numarul nu este magic.
}
int main() // Acesta este programul principal.
{
cout << "Hello world!" << endl;
int n,m,i,j,t=1,a[100][100],X[10000]; // n si m reprezinta numarul de linii respectiv coloane ale matricii 'a'.
cout<<"n=";cin>>n; // Se citeste numarul de linii ale matricii 'a'.
cout<<"m=";cin>>m; // Se citeste numarul de coloane ale matricii 'a'.
for(i=1;i<=n;i++) // Se citesc elementele matricii 'a'.
for(j=1;j<=m;j++) // Cu ajutorul variabilelor i, j se parcurg liniile, respectiv coloanele in citirea matricii.
cin>>a[i][j];
for(j=1;j<=m;j++) // Aici are loc construirea sirului 'X'.
for(i=1;i<=n;i++)
{
X[t]=a[i][j];
t++; // Variabila t reprezinta numarul de elemente ale sirului X.
}
int p1=0,p,u1,u,s=0; // Variabila p1 tine mine pozitia inceputului secventei de numere magice.
i=1;
while (i<t-1)
{
while(!magic(X[i]+X[i+1])&&i<t-1) // Cautam prima secventa de numere magice.
i++;
p=i; // Variabila u1 memoreaza pozitia ultimei valori din secventa de numere magice.
while(magic(X[i]+X[i+1])&&i<t-1)
i++; // Cautam prima secventa de numere magice.
u=i;
if((u-p)>=s)
{
p1=p;u1=u;s=u-p;
}
}
if(s>0) // Daca variabila s are valoarea mai mare ca 0 atunci inseamna ca exista o secventa de numere magice.
for(i=p1;i<=u1;i++) // Afisam secventa de numere magice.
cout<<X[i]<<" ";
else
cout<<"Nu exista aceasta secventa"; // Daca variabila s nu are valoarea mai mare ca 0 atunci inseamna ca nu exista o secventa de numere magice.
return 0;
} // Sfarsit program.