Documente Academic
Documente Profesional
Documente Cultură
I. Reprezentarea algoritmilor
read n
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)
nr0
s0
mas/nr
nrnr+1
write ma
read n
then ss+i
for i1, n-1,1 do
if n mod i=0
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
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
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
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
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;}
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
read n,c
nr0
while . . .do
if n mod 10=0 then
nrnr+1
endif
nrnr div 10
enddo
write nr
read n
i0
while i*i<=n do
ii+1
endwhile
write i-1
[ n]
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;
}
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
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
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;
#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;}
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
f 2 (x ) = 3x + 1, 2 < x 2
17, x > 2
f1(6)=8,f2(6)=17
d
e
f
g
a) 6; b) 3; c) 84; d) 48
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
c) 9
9
d) 9 9
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
1
2
3
4
cin>> n
if(n>0)m=n;
else m=-n;
cout<<m;
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
Rspuns. c.
10
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
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
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
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
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.
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;}
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) ;
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
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
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
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)
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
e)cinci; f) patru
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
[ ]
[ ]
[ 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
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)
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
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