Sunteți pe pagina 1din 22

Universitatea Targoviste- Algoritmi i structuri de date

I. Reprezentarea algoritmilor
read n

P1). Fie secvena pseudocod alturat (s-a notat prin a mod b c0


restul mpririi ntregi a lui a la b i prin a div b ctul mpririi do
cc+n mod 10
ntregi a lui a la b):
nn div 10
Alegei varianta de rspuns pentru care secvena calculeaz:
while n<>0
a) suma cifrelor lui n;
b) suma divizorilor lui n;
c) numrul de cifre ale lui n
d) nici un rspuns nu este corect.
P2). Considernd c variabilele ntregi a,b,c au valorile a=30, b=25, c=30, stabilii care din
aceste variabile i va modifica valoarea n urma executrii secvenei urmtoare:
a30;b25;c30;
if a<b then
if a<c then b10
else c100
endif
endif

a)
b)
c)
d)

variabila a
variabila c;
variabilele b i c
nici una

P3). Ce rezult prin execuia algoritmului a1), dac valoarea citit este 2418?
P4). Ce va afia secvena pseudocod a2):
integer n,p
read n
p1
while n<>0 do
pp*(n mod 10)
nn div 10
enddo
write p

integer a,b
a6;
b8
aa+b
ba-b
aa-b
write a,b

(a1)

a)6 8
b) 8 6
c) 14 2
d) 6 6
e) 2 14

(a2)

P5). Transcriei secvena (s1) de dou ori, utiliznd de fiecare dat o alt structur repetitiv.
P6). Care din variabilele ntregi x,y i z au valori egale la sfritul executrii secvenei (s2).
read n
s0
for i1,n do
ss+i
endfor
write s
(s1)

yx+1
zy-1
xz+1

a) numai x i y
b) numai x i z
c) numai y i z
d) toate au valori diferite
(s2)

Universitatea Targoviste- Algoritmi i structuri de date

P7). Fie urmtoarele secvene pseudocod:


1
2
3
4
5
6
7
8
9

nr0
s0
mas/nr
nrnr+1
write ma
read n
then ss+i
for i1, n-1,1 do
if n mod i=0

Precizai ordinea n care se execut


instruciunile din secven, astfel nct s
calculeze i s tipreasc media artitmetic a
divizorilor unui numr natural n:
a) 1,2,6,8,4,9,7,3,5
b) 6,1,2,3,5,8,4,7,9
c) 2,1,6,3,5,8,4,9,7
d) 6,2,1,8,9,7,4,3,5

P8). Algoritmul de mai jos are trei zone libere: . . .1, . . .2, . . .3.
read n
...1
do
cn mod 10
...2
nn div 10
while n>0
write ...3

Alegei varianta de rspuns astfel nct prin


completarea zonelor libere menionate n aceast
ordine ,...1,...2, ...3 algoritmul s tipreasc
numrul obinut prin inversarea cifrelor lui n:
a) a0;aa+c; a;
b) a1;aa*c; c;
c) a1;aa*10+c;a;
d) a0;aa*10+c; a;

P9). Fie urmtoarele secvene pseudocod (atenie 5 subordoneaz 2 instruciuni de atribuire, iar 6
subordoneaz una singur):
1
2
3
4
5

p0
n1
read m,k
write p
do
pp+1
n n div 10
while n>0
for i1,k,1 do
nn*m
endfor

Precizai ordinea n care se execut instruciunile


din secven, astfel nct s se afieze numrul de cifre
p al numrului mk, unde m,kN:
a) 6,5,4,3,2,1
b) 1,2,3,6,5,4
c) 3,2,6,1,5,4
d) 3,1,6,2,5,4

P10). Specificai care din expresiile de mai jos sunt calculate prin pseudocodul alturat:
read n
s0; p1;
for i1,n,1 do
read xi
ss+xi
pp*xi
endfor
es+p
write e

a) e =

xi

x +x
i

i =n

b) e =

i =1
n

i =1
n

c) e =

xi +

i=n
n

i =1

d) e =

x
i =1
n

x +x
i

i =1

1
+
xi

i =1

Universitatea Targoviste- Algoritmi i structuri de date

P11). Pentru a,bN, se consider algoritmul urmtor


Cerine:
a) s se determine valoarea tiprit pentru a=1728 i b=534
b) S se scrie un program echivalent cu pseudocodul dat.

read a,b
x0
z1
do
if a mod 10>b mod 10
then ca mod 10
else cb mod 10
endif
xx+c*z
zz*10
aa div 10
bb div 10
while(a>0 b>0)
write x
write x

Rspuns: a) 1738 numrul format din cele mai mari cifre de


acelai rang a dou numere date.

P12). Fie urmtorul pseudocod:


do
read n
while n=0
val0
read x
for in,0 do
read a
valval*x+a
endfor
write val

a). ce se va tipri pentru n=5,x=1 i irul de numere i irul de numere


1,-1 2, 0,1,4 citite cu ajutorul variabilei a
b). scriei un program pentru pseudocodul dat
c). scriei un program echivalent utiliznd instruciunea condiionat anterior
cu numr necunoscut de pai n locul instruciunii cu numr cunoscut de pai.
Rspuns a) 7

P13). Se dau dou numere a,bN. Se cere s se determine cel mai mare divizor comun al lor, cu
ajutorul algoritmului lui Euclid.
integer a,b,r
read a,b
ra MOD b
while r<>0 do
ab
br
ra mod b
endhile
write b

int main()
{int a,b,r;
cout<<"a,b ";cin>>a>>b;
r=a%b;
while(r!=0)
{a=b;b=r;
r=a%b;
}
cout<<b;
return 0;}

P14).Aceeai problem ca precedenta, doar c n locul operatorilor mod i div se va utiliza


operaia de scdere.
integer a,b
read a,b
while a<>b do
if a>b then
aa-b
endif
if a<b then
bb-a
endif
endwhile

int main()
{int n,a,b;
cout<<"a= ";cin>>a;
cout<<"b= ";cin>>b;
while(a!=b)
{if(a>b)a=a-b;
if(a<b)b=b-a;
}
cout<<a;
return 0;}

write a

Universitatea Targoviste- Algoritmi i structuri de date

P15). n pseudocodul alturat se citesc dou


valori: n numr natural, cu maximum 10 cifre,
i c (o cifr din sistemul de numeraie
zecimal). Pseudocodul numr de cte ori
apare cifra c n n. S se completeze
pseudocodul cu expresia logic corect.

read n,c
nr0
while . . .do
if n mod 10=0 then
nrnr+1
endif
nrnr div 10
enddo
write nr

P16). Pentru pseudocodul alturat se cere:

a).care va fi valoarea afiat la finalul


instruciunilor, dac n=2059
b). care sunt valorile ce pot constitui date de intrare
i care vor determina afiarea valorii 20?
c).reprezentai un algoritm echivalent care s nu
utilizeze nici o structur repetitiv.
Rspuns: a)45; b) 400-440; c) read n; write

read n
i0
while i*i<=n do
ii+1
endwhile
write i-1

[ n]

P17). Se d un numr natural n. Se cere s se descompun n factori primi. Rezultatul


descompunerii va fi afiat pe dispozitivul standard de ieire sub forma:
f1^m1
f2^m2
. . .
fk^mk
unde fk reprezint factorul prim iar mk, reprezint de cte ori apare acesta n descompunerea lui n.
Exemplu: pentru n=120 se va afia 2^3;3^1;5^1.
Soluie: Fie n = 2 3 31 51 , mprim ambii membrii prin membrul drept i obinem:
n
= 1 care se mai scrie: n / 2 / 2 / 2 / 3 / 5 = 1 . De aici, deducem ideea de rezolvare ct timp
3
2 31 51
membrul drept al ultimei egaliti este diferit de 1 procedm astfel: pentru factori primi ncepnd de
la cel mai mic f=2, verificm dac se divide n prin f; dac rspunsul este afirmativ, trecem i
verificm acelai lucru pentru f i n div f i procedeul continu pn cnd f nu mai divide
numrul n div f ; la ieirea din aceste verificri se afieaz f i numrul de apariii ale acestuia
n n, fie el m1; procedul se continu pentru urmtoarea valoare a lui f, i ctul mpririi ntregi al
lui n la f m1 .
integer n,f,m,
read n
f 2
while n<>1 do
m0
while n mod f=0 do
nn div f
mm+1
endhile
if m<>0 then
write f,m
endif
ff+1
endwhile

int main()
{int n,f=2,m;
cout<<"n= ";cin>>n;
while(n!=1)
{m=0;
while(n%f==0){n/=f;m++;}
if(m!=0)cout<<f<<" "<<m<<endl;
f++;
}
return 0;
}

Universitatea Targoviste- Algoritmi i structuri de date

P18). Se d un numr natural n cu cel mult 10 cifre. S se verifice dac numrul are proprietatea
palindromic, adic dac este egal cu oglinditul su. Exemplu: n=12321 se va afia DA iar pentru
n=124 se va afia NU.
Soluie. Vom construi oglinditul (rsturnatul) lui n i verificm dac este egal cu numrul iniial.
integer n,tmp,cifra,inv
read n,
tmpn
inv0
do
cifratmp mod 10
tmptmp div 10
invinv*10+cifra
while tmp>0
if n=inv then write DA
else write NU
endif

include<iostream>
using namespace std;
int main()
{int n,inv,cifra,tmp;
cout<<"n= ";cin>>n;
tmp=n;inv=0;
do
{cifra=tmp%10;tmp=tmp/10;
inv=inv*10+cifra;}
while(tmp>0);
if (n==inv)cout<<"DA";
else cout<<"NU";
return 0;}

P19). Se d de la tastatur un numr natural cu cel mult 10 cifre. Se cere s se determine cel mai
mare numr mai mic sau egal cu numrul dat i care are ultimele dou cifre numere prime.
Exemplu: n=100, se obine 977.Rezolvare.
long integer n,u,pu
read n
do
un mod 10
pu(n mod 100)div 10
if (u=2u=3u=5u=7)
(pu=2pu=3pu=5pu=7)then
write n; stop
endif
nn-1
while (u<>2u<>3u<>5u<>7)
(pu<>2pu<>3pu<>5pu<>7) (n>=1);
P20). Se d de la tastatur un numr natural. S se determine numrul de numere mai mici sau egale
cu numrul dat i mai mari ca 10 i care au prima i ultima cifr egale.
Soluie. Prin mpriri succesive la 10 determinm mai nti numrul de cifre (nc)al numrului citit
n. Pentru separarea primei cifre a numrului, avem nevoie s-l mprim la produsul lui 10 cu el
nsui de (nc-1) ori, acest produs este reinut n variabila p.
Ct timp numrul dat este 10 vom compara ultima cifr (u) cu prima cifr(pr) i dac vor fi egale
incrementm variabila q ce contorizeaz faptul c am gsit un numr cu condiia impus n enun.
integer n,k,q,u,pr
read n

kn;q0; p1;
kn
while k>0 do
kk/10;pp*10
endwhile
pp/10

do
un mod 10
prndiv p
if pr=u then
qq+1
endif
nn-1
while(n>=10)
write q;stop

Universitatea Targoviste- Algoritmi i structuri de date

P21). Se consider irul numerelor consecutive 1,2,3, . . .,n (1 n 100) i un numr nenul k
(1 k n). S se elimine numerele prime din ir i apoi s se afieze ultimele k rmase. Dac dup
eliminare rmn mai puin de k numere se va afia mesajul Numere insuficiente!
Exemplu: n=9 i k=4, ordinea de eliminare este 6 8 9 10.
integer n,k,i,j,poz,cnt
read n,k
cnt0; poz0
prim[1] false
for i2,n do
prim[i] true
endfor
for i2,n do
if prim[i] then //elimin multiplii
for j2, n/i do
prim[j*i] false
endfor
endif
endfor

for in,1 do
if prim[i]=false then
cntcnt+1
endif
if cnt=k then
pozi
endif
endfor
if cnt<k then
write Numere insuficiente!
else
for ipoz,n do
if not prim[i] then
write i,
endif
endfor
stop

P22).n fiierul text.in se afl un vector cu componente de tip ntreg i o cifr, astfel: pe prima
linie este memorat n( numrul de componente 1n500) i p o cifr, separate printr-un spaiu. Se
cere s se tearg din vector toate componentele care au prima cifr egal cu p i apoi s se scrie n
text.out componentele vectorului modificat, separate ntre ele printr-un spaiu.
while(k<=n) do
auxv[k]
while(aux DIV 10 >0) do
auxaux DIV 10
endwhile
if aux=p then
ik
while i<n do
v[i] v[i+1]
ii+1
endhile
nn-1
endif
kk+1
endwhile
for i1,n do
write v[i]
endfor

Exemplu
text.in
7 3
10 70 31 34 25 14 39
text.out
10 70 25 14

integer n,p, v[1..n],aux,k,i,


read n,p
for i1,n do
read v[i]
endfor
k1

P23). Se consider urmtorul algoritm, el afieaz D dac i numai dac:


a) numerele a i b sunt ambele diferite de zero
b) numerele a i b sunt egale
c) numerele a i b au acelai numr de cifre
d) prima cifr a lui a este egal cu prima cifr a lui b
e) numerele a i b sunt formate din aceleai cifre, dar
aezate n alt ordine
f) ultima cifr a lui a este egal cu ultima cifr a lui b

while (a mod 10 =b mod 10)


(a<>0)(b<>0) do
aa div 10
bb div 10
endwhile
if a=0 b=0 then
write D
else write N
endif

Universitatea Targoviste- Algoritmi i structuri de date

I. Elemente de baz ale limbajului, instruciuni de intrare ieire


P1). Care din urmtoarele valori sunt constante reale scrise corect?
1) 2905.84
5) .14

2) +75.4
6) 1.17E2

3) -19.06
7) -3.7E-5

4) -208.
8) +7.e+3

a) 1,2,3, 6, 7 ; b) toate mai puin 4; c) toate mai puin 1; d) prime ase; e) toate;
f). toate mai puin 6.

Rezolvare: Constantele flotante sunt valori reale scrise fie sub form normal fie sub form
tiintific(exponenial).Astfel:
constantele 2905.84, +75.4, -19.06 sunt constante reale scrise corect; operatorul +
naintea valorii 75.4 este inutil, dar nu este o eroare n C/C++.
constantele -208. i .14 sunt corecte reprezentnd valorile -208 i 0.14
1.17E2, -2.7E-5 i 2.e+3 sunt constante reale scrise corect n form tiinific, fiind
echivalente cu: 1.17E2=1.17*102 , -3.7E-5=-3.7*10-3
i +7.e+3=7.0*103(aici este
inutil simbolul + i este omis parte zecimal dup punct).
P2). Considerm variabilele a,b,c,d,e. S se aleag varianta corect a declaraiilor, astfel nct
atribuirile urmtoare s nu fie urmate de conversii care s modifice valorile acestora.
a=5; b=18;c=12.1; d=-3.14; e='W';
a)
b)
c)
float a,b,c,d;
int a,b,c,d;
int a,b,e;
char e;
char e;
float c,d;
d)
int a,b;
float c,d;
char e;

e)
int c,d;
float a,b;
char e;

f)
int a,b,c,d,e;

Rspuns: corecte sunt variantele a,c i d, eronate b, e i f.


P3). Se d un caracter c de la tastatur, se cere s se afieze valoarea v ce reprezint codul ASCII
al su. Apoi, se d de la tastatur un numr natural v[32, 255] i se cere s se afieze caracterul c
ce are codul ASCII egal cu numrul citit.
int main()
{char c;int v;
cout<<"caract= ";v=c=cin.get();
cout<<"cod = "<<v;
cout<<"\ncod= ";cin>>v;c=v;
cout<<"car= "<<c;
return 0;}

P4).Fie programul urmtor:


1
2
3
4
5
6
7
8
9
10
11

#include<iostream>
#include<math.h>
#define w 6
using namespace std;
int main(){
int x,y,z,a,b;
cin>>x>>y ;
a=b=2;
z=b*abs(y)-x+w;
cout<< "Val. sunt\n"<<z<< " "<<a ;
return 0;}

Universitatea Targoviste- Algoritmi i structuri de date

Considernd c la execuie se introduc de la tastatur valorile 4 i -9 n aceast ordine, precizai care


din afirmaiile de mai jos sunt adevrate.
a) citirea de la tastatur din linia 7 este eronat
b) definirea constantei simbolice w este corect
c) Execuia liniei 10 va afia: Val. Sunt\n29 3
d) dup execuia liniei 9,valoarea variabilei z este 29
e) atribuirea de la linia 8 este eronat
Rspuns: a) fals; b) adevrat; c) fals; d) adevrat; e) fals

II. Tipuri de date, variabile, expresii


P1).Care este expresia analitic a funciilor
jos(xR).Ce valori se va afia pentru x=6?

evaluate de expresiile din programul de

int main(){
int x,e1,e2;
cout<<"x= ";cin>>x;
e1=(x-15)*(x<4)+(x+2)*(x>=4);
e2=(2*x*x*x+1)*(x<=-2)+
(3*x+1)*(x>-2&&x<=2)+17*(x>2);
cout<<e1<<" "<<e2;
return 0;}

Rspuns:

mai

x 15, dac x < 4


,
f 1 ( x) =
x + 2, altfel
2 x 3 + 1, x 2

f 2 (x ) = 3x + 1, 2 < x 2
17, x > 2

f1(6)=8,f2(6)=17

P2). Ce se va afia n urma executrii urmtoarelor secvene n limbajul C.


a

d
e

f
g

unsigned char x=5;


x=~x;
cout<<(int)x;
unsigned char x=6;
x=x<<3;
cout<<(int)x;
unsigned char x=6;
x=x>>1;
cout<<(int)x;
cout<<(9>10)
float x=1/2;cout<<x;
cout<<-14/5<<" "<<-14%5;

Se tasteaz valoarea 25:

a)256; b) 128; c) 250; d) 255

a) 6; b) 3; c) 84; d) 48

a)0; b)12; c)3; d) 6

a)eroare; b) 0; c)1; d) 9>10


a)1/2; b) 0.5; c) 0; d) eroare
a) -2 -2; b)eroare ; c) -2 -4; d) -4 -2
a) ; b) 2; c) 25; d)5

char x;
cin>>x;
cout<<x;

P3). La executarea urmtoarei secvene se introduc, pe rnd valorile 8 i 9 (dup fiecare se tasteaz
enter). Ce se va afia dup execuie?
int x;
cin>>x>>x;cout<<x<<\n<<x;

a)8 9

b) 8
9

P4). Ce erori conin expresiile de mai jos?


a) x+7), unde xZ
b) ((x+2/((x-7)-4 , unde unde xR
c) y=7x, unde x,yR

c) 9
9

d) 9 9

Universitatea Targoviste- Algoritmi i structuri de date

P5).Considerm declaraiile long a=9;char b=5; Care este valoarea produs de expresia
a+b i care este tipul ei?
a) rezultatul este 14 i este de tip long
b) rezultatul este 14 i este de tip char
c) nu este posibil s adunm o variabil de tip long cu una de tip char.
P6). Considerm declaraia int a=2; Care este valoarea rezultat n urma evalurii expresiei
1/(2*a)?
a) operatorul / acioneaz numai asupra variabilelor sau constantelor de tip real. Avem o
eroare de sintax.
b) 0
c) 0.25
P7). Fie urmtoarea declaraie: int x=17,y=6. Care este valoarea rezultat n urma evalurii
expresiei: x-=y+9;

a) 15
b). n membrul stng al unei atribuiri trebuie s figureze o singur variabil i nu o expresie
c). 2
d).-2
P8). Considerm int a=-2,b=1; Care este valoarea rezultat n urma evalurii expresiei
!(a&&b)==!a||!b; ?
a)1: b) 0; c) false: d) true
Rezolvare
int main()
{int a=-2,b=1,e;
cout<<"!a= "<<!a<<endl;
cout<<"!b= "<<!a<<endl;
cout<<"!a||!b= "<<(!a||!b)<<endl;
cout<<"(a&&b)="<<(a&&b)<<endl;
cout<<"!(a&&b)="<<!(a&&b)<<endl;
e=!(a&&b)==!a||!b;
cout<<e;return 0;}

Rezultat:
!a= 0
!b= 0
!a||!b= 0
(a&&b)=1
!(a&&b)=0
1

P9). Fie secvena de program alturat:


a) de cte ori se execut instruciunea din linia 4.
b) instruciunea if este o instruciune de atribuire?
c) care instruciune dintre m=n i m=-n se va
executa la o execuie a secvenei
d) ce se va tipri pentru n=-20
e) nlocuii instrucunea if cu o atribuire

1
2
3
4

cin>> n
if(n>0)m=n;
else m=-n;
cout<<m;

Universitatea Targoviste- Algoritmi i structuri de date

III. Instruciuni secveniale


III.1. Instruciuni de atribuire, instruciuni de incrementare/decrementare
P1). Fiind date cifrele x,y,z[0,9], se cere s se calculeze expresia: x + xy + xyz .
int main()
{int x,y,z,e;
cout<<"cifre= ";cin>>x>>y>>z;
e=x+10*x+y+100*x+10*y+z;
cout<<"expr= "
<<x<<'+'<<x<<y<<'+'<<x<<y<<z<<'='<<e;
return 0;}

Exemplu: cifrele x,y,z: 7 1 4


Expresia:7+71+714=792

P2). Precizai valoarea lui n, rezultat n urma execuiei programului urmtor :


int main()
{char c;int n=65;
n=c=n;
cout<<n;
return 0;
}
a) 65 ; b)56 ; c)NULL ; d) program eronat

Rspuns : a)
P3). Fie un numr cu cinci cifre, s se afieze numrul format dup eliminarea cifrei din mijloc.
Soluie.
read x
x
(x div 1000)*100+x mod 100

P4). Ce valori afieaz programul urmtor?


int main()
{int x=20,y=8,a,b,c;
b=(a=x++,y++,c=x+y);
cout<<"\n"<<a<<" "<<b<<" "<<c;
return 0;}
a)20 28 24;

b) 30 30 20; c) 20 30 30: d) 30 20 30; e) 20 30 29

Rspuns. c.

10

Universitatea Targoviste- Algoritmi i structuri de date

III.2. Instruciunea alternativ, expresia condiional


P1). Fie trei variabile ntregi a, b, x. Scriei cu ajutorul unei expresii condiionale enunul: dac
x[a, b] atunci x ia valoarea lui a, altfel ia valoarea lui b.
a) x=((x<a)||(x>b))?a:b;
c) x=((x<a)&&(x>b))?a:b;
e)((x<a)||(x>b))?(x=a):(x=b);

b) x=(x<a||x>b)?a:b;
d) x=(x<a||x>b)?b:a;

Rspuns: a, b,e
P2). tiind c n standardul ANSI caracterele liter mare au codurile ncepnd cu 65, (A65,
B66, C67) , deducei ce valoare va afia programul urmtor:
int x,y,z,p;char a,b;
a='C';b='A';
x=a;y=2*a-b;z=3;
cout<<"x="<<x<<" y="<<y<<endl;
p=x<y?(y<z?z:y):(z<x?x:z);
cout<<p; return 0;}

a) 69; b) 96; c) 0; d) 1; e) 3
Rezolvare. Prin atribuirea x=a i y=2*a-b vom obine: x=67 , y=2*67-65=69. Evalum
x<y, rspuns adevrat(67<69), atunci p va lua valoarea ce se obine din evaluarea primei
expresii de dup primul semn ?, adic y<z?z:y evident c y<z? este fals (69>3),
atunci p va primi valoarea lui y, deci p=69, rspuns corect a).
P3). Se citesc trei litere mari n trei variabile. S se verifice dac cele trei litere sunt consecutive n
alfabet. Exemplu: Pentru literele A,B,C rspunsul este DA, iar pentru A, U, R rspunsul este
NU!.
P4).Se citesc de la tastatur dou litere mari n variabilele x,y. Se cere s se afieze aceste litere n
ordine alfabetic.
int main()
{char A,B,C;
cout<<"literele ";cin>>A>>B>>C;
if(B==(A+C)/2)cout<<"DA";
else cout<<"NU";
return 0;
}
(P14)

int main()
{char a,b;
cout<<"literele ";cin>>a>>b;
if(a<b)cout<<a<<b;
else cout<<b<<a;
return 0;
}
(P15)

P5). Care din secvenele urmtoare este corect din punct de vedere sintatic?
k=4;
if(k>=0);
else;
(a)

k=4;
if(k>=0);
then;
else;
(b)

k=4;
if k>=0;
else;
(c)

Rspuns: a)corect; b) n C/C++ nu exist then; c) expresia condiional trebuie cuprins ntre
paranteze rotunde
11

Universitatea Targoviste- Algoritmi i structuri de date

P6). Pentru dou valori a,bZ(1a,b10000) se cere s se afieze valoarea maxim utiliznd
instruciunea condiional if i operatorul condiional ?
Rezolvare. Amintim c operatorul condiional ? se folosete n expresii de forma
expr1?expr2:expr3
iar principiul de execuie este urmtorul: se evalueaz mai nti exp1, dac din evaluare rezult o
valoare diferit de zero, se evalueaz exp2 iar exp3 este ignorat, altfel se evalueaz exp3 i exp2
este ignorat.
int main()
{int a,b;
cout<<"a,b= ";cin>>a>>b;
cout<<"maximum = ";
a>b?cout<<a:cout<<b;
return 0;}

int main()
{int a,b;
cout<<"a,b= ";cin>>a>>b;
cout<<"maximum = ";
if(a>b)cout<<a;else cout<<b;
return 0;}

P7). S se realizeze un program care s rezolve ecuaia de gradul doi. Se va calcula valoarea
discriminantului d=b2-4ac :
dac d=0 ecuaia va avea o rdcin dubl
dac d>0 ecuaia va avea dou rdcini reale distincte
dac d<0, ecuaia va avea dou rdcini care nu sunt reale, se va determina partea real i
partea imaginar.
#include<iostream>
#include<math.h>
using namespace std;
int main()
{double a,b,c,d,x1,x2;
cout<<"a,b,c= ";cin>>a>>b>>c;
d=b*b-4*a*c;
cout.precision(3);
if(d==0)
{x1=x2=-b/(2*a);
cout<<"Radacina ecuatiei: x1=x2= "<<x1<<endl;
}
if(d>0)
{x1=(-b+sqrt(d))/(2*a);
x2=(-b+sqrt(d))/(2*a);
cout<<"Radacinile: x1="<<x1<<"; x2= "<<x2<<"\n";
}
if(d<0)
{cout<<"radacinile sunt complexe";
x1=-b/(2*a);x2=sqrt(-d)/(2*a);
cout<<"\nz1="<<x1<<"+i*("<<x2<<")\n";
cout<<"\nz2="<<x1<<"-i*("<<x2<<")\n";
}
return 0;}

12

Universitatea Targoviste- Algoritmi i structuri de date

III.3. Instruciunea de selecie, operaii pe numere ntregi


P1). S se determine ultima cifr a puterii 2 a+b , unde a,b[1, 10] date de la tastatur.
Indicaie: Se ine seama de observaia: 2 4 k +1 = ..2; 2 4 k + 2 = ..4; 2 4 k +3 = ..8; 2 4 k = ..6
int main()
{int a,b;
cout<<"a= ";cin>>a;
cout<<"b= ";cin>>b;
switch((a+b)%4){
case 1:cout<<2;break;
case 2:cout<<4;break;
case 3:cout<<8;break;
case 4:cout<<6;break; }
return 0;}

Exemplu:a=8,b=6 atunci numrul 2a+b se termin cu


cifra 4

P2). Se d un numr natural n cu patru cife. Se cere s se afieze numrul obinut dup ce s-a
eliminat cifra de pe poziia p (poziiile sunt numerotate de la stnga la dreapta).
int main()
{int n,p;
cout<<"n,p= ";cin>>n>>p;
switch(p){
case 1:cout<<n%1000;break;
case 2:cout<<(n/1000)*100+n%100;break;
case 3:cout<<(n/100)*10+n%10;break;
case 4:cout<<(n/10);break;
default:cout<<"nr incorect!" ;}
return 0;}

Exemplu:
n=1789 p=3 se va afia 179

P3). Se citete n variabila nrz un numr natural [1,365] ce reprezint numrul unei zile dintr-un
an nebisect. S se determine luna din care face parte ziua respectiv.
Atenie! La fiecare interval [val1, val2] se scrie astfel: case val1blanc...blanc val2:
#include<iostream>
using namespace std;
int main()
{int nrz;
cout<<"ziua= ";cin>>nrz;
switch(nrz){
case 1 ... 31:cout<<"ianuarie";break;
case 32 ... 59:cout<<"februarie";break;
case 60 ... 90:cout<<"martie";break;
case 91 ... 120:cout<<"aprilie";break;
case 121 ... 151:cout<<"mai";break;
case 152 ... 181:cout<<"iunie";break;
case 182 ... 212:cout<<"iulie";break;
case 213 ... 243:cout<<"august";break;
case 244 ... 273:cout<<"septembrie";break;
case 274 ... 304:cout<<"octombrie";break;
case 305 ... 334:cout<<"noiembrie";break;
case 335 ... 365:cout<<"decembrie";break;
default:cout<<"nr incorect!" ;}
return 0;}

13

Universitatea Targoviste- Algoritmi i structuri de date

P4). Se dau dou numere naturale nenule a i n cu cel mult 10 cifre. Se cere s se afieze ultima
cifr a puterii an.Exemplu Pentru a=1222223 i n=180 se va afia 1.
Rezolvare:Dac n=0 i a0, atunci an=1,dac a=0 i n0 atunci an=1 Se observ foarte
uor c dac numrul este diferit de zero i ultima cifr a numrului ar fi 2,. . .,9, atunci ultima cifr
a numrului an este dat de puterea a n-a a ultimei cifre astfel :

1,
2,

2 n = 4,
8,

6,

n=0
1, n = 0
3, n = 4k + 1
n = 4k + 1

n = 4k + 2 , k N * 3 n = 9, n = 4k + 2 , k N *
7, n = 4k + 3
n = 4k + 3

1, n = 4k (k 0 )
n = 4k (k 0 )

1,
4,

4 n = 6,
4,

6,

n=0
n = 4k + 1
n = 4k + 2 , k N *
n = 4k + 3
n = 4k (k 0 )

1,
5,

5 n = 5,
5,

5,

n=0
n = 4k + 1
n = 4k + 2 , k N *
n = 4k + 3
n = 4k (k 0 )

1,
6,

6 n = 6,
6,

6,

n=0
n = 4k + 1
n = 4k + 2 , k N *
n = 4k + 3
n = 4k (k 0 )

1,
7,

7 n = 9,
3,

1,

n=0
n = 4k + 1
n = 4k + 2 , k N *
n = 4k + 3
n = 4k (k 0 )

1,
8,

8 n = 4,
2,

6,

n=0
n = 4k + 1
n = 4k + 2 , k N *
n = 4k + 3
n = 4k (k 0 )

1,
9,

9 n = 1,
9,

1,

n=0
n = 4k + 1
n = 4k + 2 , k N *
n = 4k + 3
n = 4k (k 0 )

Implementare:
int main()
{int a,nr,n,r,cifra;
cout<<"nr= ";cin>>nr;
a=nr%10;// determin ultima cifra
cout<<"exponent= ";cin>>n;
if(a==0){cout<<'0';return 0;}
if(n==0)cifra=1;// a^0=1
else
{r=n%4; //evaluez restul
switch(r){
case 1:{
if(a==2)cifra=2;else
if(a==3)cifra=3;else
if(a==4)cifra=4;else
if(a==5)cifra=5;else
if(a==6)cifra=6;else
if(a==7)cifra=7;else
if(a==8)cifra=8;else
if(a==9)cifra=9;else
if(a==1)cifra=1;break;}
case 2:{
if(a==2)cifra=4;else
if(a==3)cifra=9;else

if(a==9)cifra=1;else
if(a==1)cifra=1; break;}
case 3:{
if(a==2)cifra=8;else
if(a==3)cifra=7;else
if(a==4)cifra=6;else
if(a==5)cifra=5;else
if(a==6)cifra=6;else
if(a==7)cifra=3;else
if(a==8)cifra=2;else
if(a==9)cifra=9;else
if(a==1)cifra=1; break;}
case 0:{
if(a==2)cifra=6;else
if(a==3)cifra=1;else
if(a==4)cifra=6;else
if(a==5)cifra=5;else
if(a==6)cifra=6;else
if(a==7)cifra=1;else
if(a==8)cifra=6;else
if(a==9)cifra=1;else
if(a==1)cifra=1;break;}
}
}

14

Universitatea Targoviste- Algoritmi i structuri de date


if(a==4)cifra=6;else
if(a==5)cifra=5;else
if(a==6)cifra=6;else
if(a==7)cifra=9;else
if(a==8)cifra=4;else

cout<<"ultima cifra= "<<cifra;


return 0; }

4. Instruciuni repetitive, instruciunea compus


4.1. Instruciunea repetitiv cu numr necunoscut de pai condiionat anterior
P1) Se citesc n numere reale. S se afieze valoarea minim citit.
P2). Se citete un ir de numere ntregi pn la ntlnirea numrului zero. S se calculeze media
artitmetic a numerelor din ir.
int n,k;
double min,a;
cout<<"n= ";cin>>n;
cout<<"prima val.= ";cin>>min;
k=2;
while(k<=n)
{cout<<"urm. valoare= ";
cin>>a;k++;
if(min>a)min=a;}
cout<<min;
(P1)

int n,S,nr,a;
double med;
S=nr=0;
cout<<"prima valoare= ";
cin>>a;
while(a!=0)
{nr++;S+=a;
cout<<"urm. valoare= ";
cin>>a;}
med=(double)S/nr;
cout.precision(3);cout<<med;
(P2)

P3). Se citesc n numere naturale. S se afieze cel mai mare divizor comun al lor.

Rezolvare. Se va ine seama de algoritmii prezentai n precedentele dou probleme. n variabila d


calculm cmmdc al primilor doi termeni, n continuare, cmmdc dintre d i al trei-lea numr, i se
continu procedeul cu d i al patru-lea numr, .a.m.d. La final afim ultima valoare a lui d.
int main()
{int n,a,b,d,k;
cout<<"n= ";cin>>n;
cout<<"a= ";cin>>a;
cout<<"b= ";cin>>b;
while(a!=b)
{if(a>b)a=a-b;
if(a<b)b=b-a;
}
d=a;

k=3;
while(k<=n)
{cout<<"nr= ";cin>>a;
k++;
while(a!=d)
{if(a>d)a=a-d;
if(a<d)d=d-a;
}
d=a;
}
cout<<"cmmdc= "<<d;
return 0;}

P4). n urma execuiei secvenei urmtoare s se verifice ce se ntmpl?


int a=2,b=8;
while(a!=b){a++;b--;}
cout<<a;

a) se afieaz valoarea 8; b) secvena cicleaz; c) se afieaz valoarea 5; d) erori de sintax


Rspuns. c). Explicaie: se observ c a crete i b scade, iar ieirea din ciclu se va produce atunci
cnd condiia din instruciunea while nu mai este adevrat. Urmare acestei observaii putem
ntocmi tabelul:
15

Universitatea Targoviste- Algoritmi i structuri de date

a
b
a<>b
2
8
da
3
7
da
4
6
da
5
5
nu
P5). Precizai valoarea minim a variabilei ntregi y, astfel nct urmtoarea secven de program
s afieze o singur dat un caracter T:
a)6 ; b) 5 ; c) 7 ; d) 4

Rspuns: y=7
Corpul ciclului se execut ct timp are loc
condiia x>y, iar dup prima execuie condiia
7>y trebuie s devin fals, adica 7>7.

x=6;
do{
cout<<T;
x++;
}while(x>y) ;

P6). Precizai ce se va afia n urma execuiei secvenei de program urmtoare, presupunnd c


valoarea citit de la tastatur pentru x este 539.
a) 8; b) 17; c) 0; d) 12
int main()
{int a,S=0;long x;
cin>>x;
while(x>0)
{a=x%10;S+=a;x/=10;}
cout<<S;return 0;}

Rspuns. S=17
Ct timp x<>0 se adun la S ultima cifr a lui x,
dup care aceast ultim cifre se elimin prin
intermediul operatorului / .

P7). Se citesc n numere reale, pn la ntlnirea numrului zero. S se calculeze suma dintre primul
numr, al trei-lea, al cincilea,... i produsul dintre al doi-lea, al patru-lea, etc.
P8). Se citesc de la tastatur numere naturale pn la ntlnirea lui zero. Pentru valori impare ale lui
n ,s se afieze primele n perechi de numere consecutive a cror sum este divizibil cu numrul n,
iar pentru valori pare se va afia mesajul numr par!.
Exemplu: pentru irul 3 5 7 0 se vor afia:
pentru n= 3
1 2
4 5
7 8

pentru n= 5
2 3
7 8
12 13
17 18
22 23

pentru n= 7
3 4
10 11
17 18
24 25
31 32
38 39
45 46

Rezolvare
int n,S,P,a,nr;
double med;
S=nr=0;P=1;
cout<<"prima valoare= ";
cin>>a;
while(a!=0)
{nr++;
if(nr%2!=0)S+=a;
else P*=a;
cout<<"urm. valoare= ";
cin>>a;}
cout<<"S= "<<S<<"\n";
cout<<"P= "<<P<<"\n";

int main()
{int n,nrc;long tp,tc;
cout<<"n= ";cin>>n;
while(n!=0)
{nrc=0;tp=1;tc=2;
if(n%2==0)
{cout<<"nr par!"<<endl;
goto unu;}
while(nrc<n)
{if((tp+tc)%n==0)
{cout<<tp<<" "<<tc<<endl;
nrc=nrc+1;
}

16

Universitatea Targoviste- Algoritmi i structuri de date


}return 0;

tp=tc;tc=tc+1;
}
unu:cout<<"n= ";cin>>n;
}
return 0;}
(P7)

(P8)

P9). Se citesc de la tastatur mai multe iruri de numere ntregi, fiecare terminndu-se cu valoarea
zero. Operaia de citire se ncheie la introducerea valorii zero de dou ori consecutiv. Determinai
cel mai mare numr prim din ir.
Exemplu:
date.in
3 4 7 140 29 113 0 ->sf sir1
15 29 71 41 31 113 13 0->sf sir2
20 2 113 23 71 0 0 >sf sir3+->sf. date

date.out
Valorile <>0 de verificat sunt:
3 4 7 140 29 113
15 29 71 41 31 113 13
20 2 113 23 71
Nr prim de val maxima: 113

Rezolvare:
#include<iostream>
#include<fstream.h>
#include<math.h>
using namespace std;
int main()
{ifstream f("text.in");
int a,d,sw=0,max;bool ok;
f>>a;
while(a!=0)
{while(a!=0)
{cout<<a<<" ";
if(a==0||a==1)ok=false;
else if(a==2)ok=true;
else
{ok=true;

for(d=2;d<=sqrt(a);d++)
if(a%d==0){ok=false;break;}
}
if(ok==true)
{if(sw==0){max=a;sw=1;}
else if(max<a)max=a;
}
f>>a;
}
cout<<endl;
f>>a;
}
cout<<"Nr prim de val maxima: "<<max;
f.close();return 0;}

P10). Se d un numr natural n cu cel mult 10 cifre. Se cere s se tearg din scrierea lui n toate
cifrele pare. Dac toate cifrele lui n sunt pare se va afia 0.
Exemplu: pentru n=124568974 se va afia 1597
int main()
{long int n,ni=0;
short int c;
cout<<"n= ";cin>>n;
while(n!=0)
{c=n%10;n/=10;
if(c%2!=0)ni=ni*10+c;
}
if(ni==0)cout<<0;
else
while(ni!=0)
{cout<<ni%10;
ni/=10;
}
return 0;}

17

Universitatea Targoviste- Algoritmi i structuri de date

4.2. Instruciunea repetitiv cu un numr necunoscut de pai condiionat posterior


P1). Fie secvena urmtoare:
int x=3;
do{x--;x*=2;}while(x!=10);

I). De cte ori se execut instruciunea compus subordonat instruciunii do?


a) de trei ori; b) de dou ori; c) o dat; d) secvena cicleaz Rspuns: a)
II). S se nlocuiasc cele dou atribuiri subordonate instruciunii do cu una singur astfel nct
programul obinut s fie echivalent cu cel iniial . Rspuns: x=2*(x-1)
III). Pentru ce valori iniiale ale lui x din cele de mai jos, secvena dat nu cicleaz?
pas

x=0

x=1

x=2

x=4

x=-1;
x=-2
x=-3
x=-6
...

x=0
x=0
x=-1
x=-2
...

x=1
x=2
x=-1
x=-2
...

x=3
x=6
x=5
x=10
stop

2
3

x<>10
da
nu

Se observ din tabel c pentru valorile iniiale 0, 1 i 2 prin cele dou atribuiri din secvena iniial,
valorile lui x se deprteaz de 10, n sensul c ia valori negative, iar pentru x=4, dup pasul al doilea x devine 10, adic secvena nu se mai execut, aadar rspunsul este x=4.
P2). S se afieze un tabel cu valorile funciilor sin(x) i cos(x) pentru x[0,90] cu pasul 5.
P3). Pentru nN, 1n 106 ,s se verifice dac el este format numai din cifre prime.
Int main(){
double x=0,u;
do
{u=(M_PI*x)/180;
cout<<x<<" ";cout.precision(4);
cout<<fixed<<sin(u)<<" "
<<cos(u)<<endl;
x=x+5;
}while(x<=90);
return 0;}
(p44)

int main()
{long n;
bool p=true;int c;
cout<<n= ;cin>>n;
do
{c=n%10;
n/=10;
if(c==1||c==4||c==6||c==8)p=false;
}while(n>10);
if(p)cout<<DA;
else cout<<NU; return 0;}
(p45)

P4). S se determine primele n perechi de numere prime care sunt consecutive n mulimea
numerelor impare. De exemplu pentru n=20 se va afia:
2,3) (3,5) (5,7) (7,9) (9,11) (11,13) (13,15) (15,17)
(17,19) (19,21) (21,23) (23,25) (25,27) (27,29) (29,31) (31,33)
(33,35) (35,37) (37,39) (39,41)

Rezolvare:
#include<iostream>
using namespace std;
int main()
{int n,a,b,aux1,aux2,k;
cout<<"n= ";cin>>n;
a=2;b=3;
k=0;
while(k<n)
{cout<<"("<<a<<","<<b<<") ";
k++;
if(k%8==0)cout<<endl;
a=b;

do{
b=b+2;
aux1=a;
aux2=b;
while(aux1!=aux2)
{if(aux1>aux2)aux1=aux1-aux2;
if(aux1<aux2)aux2=aux2-aux1;
}
}while(aux1!=1);
}
return 0;}

18

Universitatea Targoviste- Algoritmi i structuri de date

Instruciunea repetitiv cu un numr cunoscut de pai


P1). S se determine toate perechile de numere gemene pn la o anumit valoare n, dat. Dou
numere sunt gemene dac sunt ambele prime i diferena dintre cel mai mare i cel mai mic este 2.
Exemplu: Pentru n=100 se vor afia perechile:
(3,5), (5,7), (11,13), (17,19), (29,31), (41,43), (59,61), (71,73)
Rezolvare.
#include<iostream>
#include<math.h>
using namespace std;
int main()
{int n, i,j,rad;
bool prim;
cout<<"n= ";cin>>n;
for(i=3;i<=n;i+=2)
{prim=true;rad=sqrt(i+2);
for(j=2;j<=rad;j++)
if(i%j==0||(i+2)%j==0){prim=false;break;}
if(prim)cout<<"("<<i<<","<<i+2<<")\n";
}
return 0;}

P2). Fie o variabil x de tip ntreg fr semn, diferit de 0 i 1. n urma execuiei secvenelor de
program de mai jos, valoarea variabilei p ar trebui s fie: true dac numrul x este prim,
respectiv false, n caz contrar. Care dintre ele funcioneaz corect pentru a afia faptul c
numrul citit este prim sau nu?.
int x; bool p=true;
cin>>x;
for(i=2;i<x;i++)
if(x%i==0)p=false;
cout<<p;
(a)

int x; bool p=true;


cin>>x;
for(i=2;i<x;i++)
if(x%i==0)p=false;
else p=true;
(b)

int x; bool p=false;


cin>>x;
for(i=2;i<x;i++)
if(x%i==0)p=true;
(c)

Rezolvare. Prin ipotez presupunem c x este prim. Dac pentru i[2, x-1] gsesc o valoare care
divide pe x, atunci ipoteza este fals; se afieaz valoarea corespunztoare pentru p. n consecin,
secvena a este corect. Secvena b nu realizeaz corect testarea, iat un exemplu: fie x=8, testm
toate valorile de la 2 la 7; pentru i=2, valoarea false a variabilei p ne arat c am gsit un
divizor propriu, deci numrul nu este prim i p nu ar trebui s se mai modifice n continuare; dar,
prin executarea celorlai pai se constat c ultima valoare a lui p este true, ceea ce ne arat c
variabila else nu trebuie s apar n instruciunea if, deci secvena b nu este corect.
Secvena c rspunde diferit la cerina problemei date, rezult c nu este corect.
pasul
0
1
2
3
4
5
6

i
i=2
i=3
i=4
i=5
i=6
i=7

x%i==0?
da
nu
da
nu
da
nu

19

p=true
p=false
p=true
p=false
p=true
p=true
p=true

Universitatea Targoviste- Algoritmi i structuri de date

P3). Ce va afia secvena urmtoare:


int s=0,i;
for(i=1;i<=10;i++)
{i=i/10;s+=i;}
cout<<s;

a) 0 ; b) 1; c) 10; d) secvena cicleaz


Rezolvare. Datorit atribuirii i=i/10; programul nu va atinge valoarea limit 10 pentru a iei din
ciclu, la fiecare pas i devine 1, iar apoi prin atribuirea i=i/10 devine zero. Rspuns d).
P4). Dac de la tastatur se introduce numrul 26, cte valori distincte va afia programul urmtor?
#include<iostream>
#include<math.h>
using namespace std;
int main()
{int x,n,i;
for(cin>>n,i=1;;x=sqrt(i),cout<<x,i++)
if(i>n)break;
return 0;}

a) una; b) dou; c) nici una; d) trei;

e)cinci; f) patru

Rezolvare. ntr-un ciclu for de forma for(<exp1>;<exp2>,<exp3>) una din expresii


poate s lipseasc dac rolul su este suplinit ntr-un alt mod. n cazul nostru lipsete exp2, dar
ciclul nu se va executa la infinit, pentru c n corpul su ntlnim instruciunea break, care la un
moment dat realizeaz ieirea forat din ciclu. Exp1 este format din: cin>>n,i=1 , deci avem
dou instruciuni separate prin operatorul ,, ele se vor executa n aceast ordine, dar numai i=1
este expresia de iniializare a ciclului for, deci cin>>n poate fi scos n afara ciclului. n mod
asemntor, exp3 este alctuit din trei instruciuni separate prin virgul : x=sqrt(i),
cout<<x,i++, ultima fiind obligatorie n for (fiind instruciunea de micare),celelalte dou pot
fi incluse n corpul ciclului. Rezult c secvena dat n ciclul for este echivalent cu:
cin>>n;
for(i=1;i<=n;i++)
{x=sqrt(i);cout<<x;}

Prin atribuirea x=sqrt(i); x fiind de tip ntreg el va reine numai partea ntreag a lui radical
din i.Dac se d valoarea n=26, atunci secvena de mai sus afieaz valoarea i (adic partea

[ ]

ntreag a lui i ) pentru i = 1,26 ,n concluzie, rspunsul corect este e).


:
i =1 pentru i=1,2,3

[ ]
[ i ]=2 pentru i=4,5,. . .8,
[ i ]=3 pentru i=9, . . .,15
[ i ]=4 pentru i=16,. . .,22,
[ i ]=5 pentru i=23,24,25

20

Universitatea Targoviste- Algoritmi i structuri de date

P5). Fie secvena S1) de mai jos, care calculeaz i afieaz produsul primelor n numere naturale,
P=1*2*...*n, unde n este o valoare dat:
p=1;
for(i=1;i<=n;i++)
p=p*i;
cout<<p;
(S1)

for(p=1,i=1;i<=n;P*=i++);
cout<<p;

i=P=1;
while(i<=n?P*=i++:0)
cout<<p;

(S2)

(S3)

Pentru secvenele S2 i S3 precizai care dintre afirmaiile urmtoare sunt corecte:


a) ambele sunt corecte sintactic, dar nici una nu este echivalent cu S1
b) ambele secvene S2 i S3 sunt eronate
c) ambele sunt corecte sintactic, dar numai S2 este echivalent cu S1
d) secvena S2 conine erori, iar S3 este corect sintactic i echivalent cu S1
e) S2 i S3 sunt corecte sintactic i echivalente cu S1
Rspuns. e)
P6).Se citete de la tastatur, un ir de n numere ntregi. Realizai un program care determin
numrul de apariii al celui mai mare numr prim din ir.
Exemplu
sir.in
10
2 4 17 5 15 17 24 99 17 10

sir.out
cm mare nr prim: 17 apare de 3 ori

Indicaie. Iniial variabila sw=0, dup care, la gsirea primului numr prim sw devine 1. n
variabila nr se evideniaz numrul curent al numrului prim gsit. Odat cu parcurgerea
tabloului de numere prime gsite se determin i cel mai mare numr. Variabila nrap se va
contoriza numrul de apariii al celui mai mare numar prim.
#include<math.h>
#define MAX 1000
using namespace std;
int main()
{ ifstream f("sir.in");
int prime[MAX],a,max;
int n,k,nr=0,nap=0,sw=0,d;
bool ok;f>>n;
for(k=0;k<n;k++)
{f>>a;//citesc nr curent
a=abs(a);//am facut nr pozitiv
if(a==0||a==1)ok=false;
else
if(a==2)ok=true;
else
{ok=true;
for(d=2;d<=a-1;d++)
if(a%d==0)
{ok=false;break;}
}

if(ok==true)
{//am gasit un nr prim
prime[nr]=a;nr=nr+1;
if(sw==0){max=a;sw=1;}
else if(max<a)max=a;
}
}//endfor
f.close();
for(k=0;k<nr;k++)
if(max==prime[k])nap++;
cout<<"cm mare nr prim: "
<<max<<" apare de "<<nap<<" ori";
return 0;}

21

Universitatea Targoviste- Algoritmi i structuri de date

P7). Se consider un numr natural n, (n100), format din maximum 9 cifre. Realizai un program
care verific dac numrul n este bine ordonat. Numerele bine ordonate sunt cele care au
proprietatea c cifrele lor apar fie n ordine cresctoare, fie descresctoare.
#include<iostream>
using namespace std;
int main()
{long n,m,nrc=0,k;int cifre[10],r;
bool ok1=true,ok2=true; //
cout<<"n= ";cin>>n;m=n;
//formam cu cifrele numarului un vector
while(m!=0){r=m%10;cifre[nrc]=r;m=m/10;nrc=nrc+1;}
//verific daca cifrele sunt ord. crescator
for(k=0;k<nrc-1;k=k+1)
if(cifre[k]<cifre[k+1]){ok1=false;break;}
//verific daca cifrele sunt ord descrescator
for(k=0;k<nrc-1;k=k+1)
if(cifre[k]>cifre[k+1])ok2=false;
if(!ok1&&!ok2)cout<<"nr nu este bine ordonat"<<endl;
else
cout<<"nr "<<n<<" este bine ordonat "<<endl;
return 0;}

P8). Se citete de la tastatur un ir de k intervale, pentru fiecare fiind introduse cele dou limite
[a, b], a<b numere ntregi. Alctuii un program care s permit afiarea limitelor intervalului ce
conine cele mai multe valori ntregi.
Exemplu: Pentru k=4 i irul de numere: 2 6 4 8 3 22 5 10 se va afia (3,22)
Rezolvare.Citesc primul interval, presupun c nr de puncte este cel maxim.Pentru fiecare interval
citit ulterior,compar numarul de valori ntregi din interiorul su cu valaoarea maxim curent. Dac
aceast valoare este mai mare, ea devine maximul cutat i corespunzator rein marginile sale n li
respectiv ls.
int main()
{fstream f("interval.in");
int a,b,k,i,li,ls,max;
f>>k;
f>>a>>b;max=b-a+1;li=a;ls=b;
for(i=2;i<=k;i++)
{f>>a>>b;
if(b-a+1>max){max=b-a+1;li=a;ls=b;}
}
f.close();
cout<<"maxim puncte= "<<max<<endl;
cout<<"["<<li<<","<<ls<<"]"<<endl;
return 0;}

22

S-ar putea să vă placă și