Exercițiul 1
S-a notat cu
x%y
restul împărţirii numărului natural
x
la numărul natural nenul
y
şi cu
[z]
partea întreagă a numărului real
z
.
a) Scrieţi valoarea afişată dacă pentru
x
se citeşte valoarea 4589 şi pentru
y
se citeşte valoarea 723. (6p.)
b) Scrieţi toate perechile de valori care pot fi citite pentru
x
şi
y
astfel încât valoarea afişată să fie 200. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat în care să se înlocuiască structura repetă…până când cu o structură repetitivă cu test iniţial. (6p.)
citeşte x,y (numere naturale nenule) t←0 u←1 ┌repetă │┌dacă x%10 > y%10 ││atunci ││ z ← x%10 ││altfel ││ z ← y%10 │└■ │t←t+z*u │u←u*10 │x←[x/10] │y←[y/10] └până când x=0 şi y=0 scrie t
Rezolvare
Punctul a).
După cum se observă, algoritmul păstrează în variabila
z
cea mai mare ultima cifră dintre numerele
x
și
y
. Apoi, construiește în
t
un număr format din cele mai mari cifre ale lui
x
și
y
, păstrând ordinea acestora. Numărul
t
va avea tot atâtea cifre cât cel mai mare număr dintre cele două.
Deci, în cazul
x = 4589
și
y = 723
, numărul
t = 4789
.
Punctul b).
Pentru
t = 200
, trebuie ca
- cifra maximă a unităților și zecilor să fie 0.
- cifra maximă a sutelor să fie 2.
Deci, sunt doar două posibilități: 100 și 200. Trebuie perechi formate din aceste 2 numere: (100, 200), (200, 100).
Punctul c).
#include <iostream>
using namespace std;
int main()
{
int x, y, t, u, z;
cin >> x >> y;
t = 0;
u = 1;
do {
if( x % 10 > y % 10 )
z = x % 10;
else
z = y % 10;
t = t + z * u;
u = u * 10;
x = x / 10;
y = y / 10;
} while (x != 0 || y != 0); //in pseudocod este pana cand,
//deci folosim valoare de adevar opusa
cout << t;
return 0;
}
Punctul d).
Vom folosi structura cât timp….execută. Atenție, atunci când trecem de la până când la cât timp să nu greșim. Toate condițiile din testul de adevăr trebuie să fie negate!
citeşte x,y (numere naturale nenule) t←0 u←1 ┌cât timp x≠0 sau y≠0 execută │┌dacă x%10 > y%10 ││atunci ││ z ← x%10 ││altfel ││ z ← y%10 │└■ │t←t+z*u │u←u*10 │x←[x/10] │y←[y/10] └■ scrie t
Se observă că nu este nevoie să facem nimic special pentru această modificare, decât să avem grijă la condiție. De ce oare?
Exercițiul 2
S-a notat cu
x%y
restul împărţirii numărului natural
x
la numărul natural nenul
y
.
a) Scrieţi valoarea afişată în urma executării algoritmului dacă se citesc, în ordine, valorile: 5, 14, 6, 15, 16, 90. (6p.)
b) Ştiind că valoarea citită pentru
x
este 7, scrieţi un şir de numere distincte care pot fi citite în continuare astfel încât valoarea afişată să fie 0. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat în care să se înlocuiască structura pentru…execută cu o structură repetitivă cât timp…execută. (6p.)
citeşte x (număr natural nenul) nr ← 0 ┌pentru i←1,x execută │ citeşte n (număr întreg) │┌dacă n%x=0 atunci ││ nr←nr+1 │└■ └■ scrie nr
Rezolvare
Punctul a).
Este un exercițiu simplu. Se citesc
x
numere și se contorizează divizibilitatea acestora la
x
. Pentru
x = 5
, răspunsul este
nr = 2
.
Punctul b).
Orice șir de 7 numere care nu sunt divizibile cu 7.
Exemplu: 1 2 3 4 5 6 8
Punctul c).
#include <iostream>
using namespace std;
int main()
{
int x, n, nr, i;
cin >> x;
nr = 0;
for ( i = 1; i <= x; i++) {
cin >> n;
if ( n % x == 0 )
nr = nr + 1;
}
cout << nr;
return 0;
}
Punctul d).
Vom transform structura pentru…execută cu cât timp…execută.
citeşte x (număr natural nenul) nr ← 0 i ← 1 ┌cât timp i <= x execută │ citeşte n (număr întreg) │┌dacă n%x=0 atunci ││ nr←nr+1 │└■ └■ scrie nr
Exercițiul 3
S-a notat cu
[x]
partea întreagă a numărului real
x
şi cu
a%b
restul împărţirii numărului întreg
a
la numărul întreg nenul
b
.
a) Scrieţi valoarea care se va afişa pentru
n=8291
. (6p.)
b) Scrieţi o valoare de 5 cifre distincte care poate fi citită pentru variabila
n
astfel încât numărul afişat să fie 7080. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat, în care să se înlocuiască structura repetă…până când cu o structură repetitivă de alt tip. (6p.)
citeşte n (număr natural) r←0 ┌repetă │ r←(r*10+n%10)*10 │ n←[n/100] └până când n<10 scrie r
Rezolvare
Punctul a).
Acest algoritm este o modificare a algoritmului de răsturnare. În loc să răsturnăm cifră cu cifră, luăm doar jumătate din ele (
n / 100
) și la formarea răsturnatului, fiecare adăugăm un 0 (înmulțirea cu 10 de la final).
Astfel că,
r = 1020
.
Punctul b).
Având explicația anterioară, trebuie să găsim numere care să obțină
r = 7080
. Deci, trebuie să aibă cifra unităților 7 și cea a sutelor 8, de forma ab8c7.
Exemplu: 12837
Punctul c).
#include <iostream>
using namespace std;
int main()
{
int n, r;
cin >> n;
do {
r = ( r * 10 + n % 10 ) * 10;
n = n / 100;
} while (n >= 10); //atentie la implementare, era pana cand
cout << r;
return 0;
}
Punctul d).
În pseudocod, varianta inițială avea structura repetă…până când. Deci, la modificare, trebuie să negăm condiția. Nu trebuie să facem alte modificări. De ce?
citeşte n (număr natural) r←0 ┌cât timp n >= 10 execută │ r←(r*10+n%10)*10 │ n←[n/100] └■ scrie r
Exercițiul 4
S-a notat cu
a%b
restul împărţirii numărului natural
a
la numărul natural nenul
b
, iar cu
[a/b]
câtul împărţirii întregi a numărului natural a la numărul natural nenul
b
.
a) Scrieţi numărul care se va afişa dacă se citesc pentru
n
valoarea 528791 şi pentru
k
valoarea 6. (6p.)
b) Dacă pentru
k
se citeşte valoarea 9 scrieţi toate valorile formate din exact 5 cifre care se pot citi pentru variabila
n
, astfel încât rezultatul afişat să fie, de fiecare dată, 2008. (6p.)
c) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
d) Scrieţi în pseudocod un algoritm echivalent cu cel dat care să utilizeze în locul structurii cât timp…execută o structură repetitivă condiţionată posterior. (6p.)
x ← 0 citeşte n,k (numere naturale nenule) ┌cât timp n≠0 execută │ ┌dacă n%10<k atunci │ │ x ← x*10 + n%10 │ └■ │ n ← [n/10] └■ scrie x
Rezolvare
Punctul a).
O altă variație a răsturnatului unui număr, doar că vom folosi doar cifrele mai mici decât
k
.
Deci, pentru
n = 528791
și
k = 6
,
x = 125
.
Punctul b).
Pentru a obține
x = 2008
, iar
k = 9
, trebuie să îl punem pe 9 undeva unde să nu ne afecteze. Iar 2008, trebuie să fie inversat, adică 8002. Iată numerele din 5 cifre care respectă condițiile date: 80020, 80029, 80092, 80902, 89002, 98002.
Punctul c).
#include <iostream>
using namespace std;
int main()
{
int n, k, x;
cin >> n >> k;
while ( n != 0 ){
if ( n % 10 < k )
x = x * 10 + n % 10;
n = n / 10;
}
cout << x;
return 0;
}
Punctul d).
x ← 0 citeşte n,k (numere naturale nenule) ┌repetă │ ┌dacă n%10<k atunci │ │ x ← x*10 + n%10 │ └■ │ n ← [n/10] └cât timp n≠0 scrie x
Exercițiul 5
S-a notat cu
x%y
restul împărţirii numărului natural
x
la numărul natural nenul
y
.
a) Scrieţi ce se va afişa pentru
x=8
. (6p.)
b) Scrieţi toate numerele naturale, de câte o singură cifră, care, citite pentru
x
, determină afişarea valorii 4. (6p.)
c) Scrieţi în pseudocod un algoritm echivalent cu cel dat care să nu utilizeze nicio structură repetitivă. (4p.)
d) Scrieţi programul C/C++ corespunzător algoritmului dat. (10p.)
citeşte x (număr întreg) ┌dacă x<0 atunci │ x ← -x └■ p ← 1 ┌pentru i←1,x execută │ p ← (p*4)%10 └■ scrie p
Rezolvare
Punctul a).
Ne suflecăm mânecile și scriem primele valori de calcul:
x = 1; p = ( 1 * 4 ) % 10 = 4 x = 2; p = ( 4 * 4 ) % 10 = 6 x = 3; p = ( 6 * 4 ) % 10 = 4 // hopa se repetă
Deci, observăm deja o repetiție în cod. Pare că pentru
x
par, returnăm 6, altfel returnăm 4.
De ce am ignorat prima parte? Pentru că
x
trebuie să fie pozitiv orice ar fi.
Cât ne va da dacă
x = 8
?
p = 6
.
Punctul b).
Am răspuns deja mai sus. Orice
x
impar.
Punctul c).
Dacă am înțeles algoritmul la punctul a)., rezolvarea este banală.
citeşte x (număr întreg) ┌dacă x = 0 atunci │ scrie 1 │ altfel │ ┌dacă x % 2 = 0 atunci │ │ scrie 6 │ │ altfel │ │ scrie 4 │ └■ └■ scrie p
Punctul d).
#include <iostream>
using namespace std;
int main()
{
int n, k, x;
cin >> n >> k;
do {
if ( n % 10 < k )
x = x * 10 + n % 10;
n = n / 10;
} while ( n != 0 );
cout << x;
return 0;
}
Răspunsuri