Sesiunea august-septembrie

Subiecte bac 2017-Sesiunea de toamna

Rezolvare bac 2017-Sesiunea de toamna

Subiectul I

1. c

2.

a) 15

b) 3, 5, 7

c) citeste n

(numar natural nenul)

k<-0

-pentru i<-1,n executa

| citeste x

| (numar natural nenul)

| y<-2

| -cat timp x>1 si x%y≠0 executa

| | y<-y+1

| |_

|

| -daca k<[x/y] atunci

| | k<-[x/y]

| |_

|_

scrie k

d)

#include <iostream>

using namespace std;

int main()

{

cout << "Hello world!" << endl;

unsigned int n,x,y,i,k;

cin>>n;

k=0;

i=1;

while(i<=n)

{

cin>>x;

y=2;

while(x>1&&x%y!=0)

y=y+1;

if(k<x/y)

k=x/y;

i=i+1;

}

cout<<k;

return 0;

}

Subiectul al II-lea

1. a

2. b

3. noduri: 2, 3, 4

muchii: 2-4, 3-4

4.

n=0;

for(i=1;i<=11;i++)

{ cin>>s;

if(strstr(s,"are"))

if(strcmp(strstr(s,"are"),"are")==0)

n++;

}

5.

#include <iostream>

using namespace std;

float a[51][50];

void citire(float a[51][50], unsigned int n)

{

unsigned int i,j;

for(i=0;i<n;i++)

for(j=0;j<n;j++)

cin>>a[i][j];

}

void afisare(float a[51][50], unsigned int n)

{

unsigned int i,j;

cout<<"\n";

for(i=0;i<=n;i++)

{

for(j=0;j<n;j++)

cout<<a[i][j]<<" ";

cout<<"\n";

}

}

float media(float a[51][50], unsigned int c, unsigned int n)

{

unsigned int i;

float s=0;

for(i=0;i<n;i++)

s=s+a[i][c];

return s/n;

}

void schimbare(float a[51][50], unsigned int n)

{

unsigned int i,j;

float v[51];

for(j=0;j<n;j++)

v[j]=media(a,j,n);

for(i=n;i>n/2;i--)

for(j=0;j<n;j++)

a[i][j]=a[i-1][j];

for(j=0;j<n;j++)

a[n/2][j]=v[j];

}

int main()

{

cout << "Hello world!" << endl;

unsigned int n;

cout<<"n=";cin>>n;

citire(a,n);

schimbare(a,n);

afisare(a,n);

return 0;

}

Subiectul al III-lea

1. b

2.

2, 3, 4, 1, 5, 6

2, 3 ,4, 1, 6, 5

3.

void triplete(unsigned int a, unsigned int b, unsigned int c)

{

char exista=0;

unsigned int x,y,z;

for(x=a;x<=b;x++)

for(y=x;y<=b;y++)

for(z=y;z<=b;z++)

if(x+y+z==c)

{

exista=1;

cout<<"{"<<x<<","<<y<<","<<z<<"}";

}

if(exista==0)

cout<<"nu exista";

}

4.

b)

#include <iostream>

#include <fstream>

using namespace std;

int main()

{

cout << "Hello world!" << endl;

ifstream f("bac.in");

int a[1001]={0},n,i=1000,r=0,t1=0,nr=0;

while(f>>n)

{

a[n]=1;

nr++;

}

if(nr<2)

{

cout<<"nu";

f.close();

return 0;

}

while(!a[i]&&i>0)

i--;

t1=i;

i--;

while(!a[i]&&i>0)

i--;

r=t1-i;

t1=i;

i--;

for(i;i>0;i--)

{

while(!a[i]&&i>0)

i--;

if(r!=t1-i&&i>0&&a[i])

{

cout<<"nu";

f.close();

return 0;

}

t1=i;

}

cout<<r;

f.close();

return 0;

}

a)

Citesc din fisier numerele si le marchez in tabloul "a[1001]". Daca numarul "i" a existat in fisier, inseamna ca valoarea pozitiei "i" din tabloul "a" este 1. Cu ajutorul variabilei "nr" am numarat numerele din fisier. Daca exista un singur numar in fisier, acesta nu poate forma o progresie aritmetica.

Parcurg tabloul de la final la inceput. Daca am gasit o pozitie marcata, adica valoarea pozitiei "i" este diferita de 0, atunci retin acea pozitie si caut urmatoarea pozitie marcata. Diferenta dintre aceste pozitii reprezinta ratia. Daca pana sa ajung la inceputul tabloului, gasesc o astfel de diferenta, dar care sa nu fie egala cu ratia tocmai gasita, inseamna ca numerele nu sunt in progresie aritmetica.

Programul este eficient deoarece: este de tipul O(n), foloseste un tablou de dimensiuni reduse, este liniar, nu parcurge in fiecare caz intregul tablou.