https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_6&feed=atom&action=historyClasa a IX-a lecția 6 - Revision history2024-03-29T01:12:37ZRevision history for this page on the wikiMediaWiki 1.40.0https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_6&diff=18255&oldid=prevBella at 18:07, 18 October 20222022-10-18T18:07:32Z<p></p>
<p><b>New page</b></p><div>'''Note de curs: prof. Isabela Coman'''<br />
= Prelucrarea cifrelor unui numar =<br />
== Teorie ==<br />
=== Prima cifra a unui numar ===<br />
Se citește n. Să se afișeze prima cifra lui n.<br />
'''Pseudocod'''<br />
<syntaxhighlight><br />
intreg n<br />
citeste n<br />
cat_timp ( n > 9 ) executa<br />
n = n div 10<br />
scrie n<br />
</syntaxhighlight><br />
<br />
'''C/C++'''<br />
<syntaxhighlight><br />
#include <stdio.h><br />
<br />
int main() {<br />
int n;<br />
<br />
scanf( "%d", &n );<br />
<br />
while ( n > 9 ) <br />
n = n / 10;<br />
<br />
printf( "%d ", n );<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main() {<br />
int n;<br />
<br />
cin >> n;<br />
<br />
while ( n > 9 ) <br />
n = n / 10;<br />
<br />
cout << n;<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main() {<br />
int n;<br />
int p = 1000000000;<br />
cin >> n;<br />
while ( p > n )<br />
p = p / 10;<br />
cout << n / p;<br />
return 0;<br />
}</syntaxhighlight><br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main() {<br />
int n;<br />
cin >> n;<br />
int p = 1;<br />
while ( p <= n )<br />
p = p * 10;<br />
p = p / 10;<br />
cout << n / p;<br />
return 0;<br />
}</syntaxhighlight><br />
<br />
=== Afisare cifre in ordine inversa ===<br />
Se citește n. Să se afișeze cifrele lui n în ordine inversă.<br />
[[Image:sl-cifre-număr-invers.gif|frame|none|Afișare cifre număr în ordine inversă]]<br />
<br />
Acest algoritm de '''PARCURGERE''' a cifrelor unui numar, se va aplica problemelor care prelucreaza intr-un fel sau altul cifrele numarului respectiv.<br />
Pentru a putea parcurge cifrele unui numar, accesam mai intai cifra care se poate extrage cel mai usor din numar, si anume ultima cifra (stim ca ultima cifra a oricarui numar este restul impartirii numarului respectiv la 10). Dupa ce am extras aceasta cifra si am afisat-o , eliminam aceasta cifra din numar, astfel incat, penultima cifra a numarul va deveni ultima cifra, si deci o vom putea extrage usor si pe aceasta, la pasul urmator.<br />
==== Pseudocod ====<br />
intreg n<br />
Citeste n<br />
Cat_timp ( n > 0 ) executa<br />
scrie n mod 10<br />
n = n div 10<br />
<br />
====C:====<br />
<syntaxhighlight><br />
#include<stdio.h><br />
int main(){<br />
int n;<br />
printf( "Dati un numar: " );<br />
scanf( "%d", &n );<br />
printf( "Cifrele in ordine inversa: " );<br />
while(n > 0){ <br />
printf( "%d", n % 10 );<br />
n = n / 10;<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
====C++:====<br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main(){<br />
int n;<br />
cin >> n;<br />
while( n > 0 ){<br />
cout << n % 10;<br />
n = n / 10;<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Suma cifrelor unui numar ===<br />
[[Image:sl-suma-cifre-n.gif|frame|none|Schemă logică]]<br />
<br />
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila ACUMULATOR (o vom denumi s, de la suma), variabila in care vom aduna pe rand valorile cifrelor accesate. Pe masura ce accesam o cifra a unui numar, adunam valoarea cifrei la valoarea anterioara a acumulatorului, care valoare, este initial 0. <br />
Daca am fi dorit sa calculam produsul cifrelor unui numar, cat ar fi trebuit sa fie initial variabila acumulator?<br />
<br />
==== Pseudocod ====<br />
intreg n, s<br />
citeste n<br />
s = 0;<br />
cat_timp ( n > 0 ) executa<br />
s <- s + n mod 10<br />
n <- n div 10<br />
scrie s<br />
<br />
==== C ====<br />
<syntaxhighlight><br />
include<stdio.h><br />
int main(){<br />
int n, s;<br />
scanf( "%d", &n );<br />
s = 0;<br />
while( n > 0 ){<br />
s= s + n % 10;<br />
n = n / 10;<br />
}<br />
printf("%d",s);<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
====C++:====<br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, s;<br />
cin >> n;<br />
s = 0;<br />
while( n > 0 ){<br />
s = s + n % 10;<br />
n = n / 10;<br />
}<br />
cout << s;<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Cate cifre are un numar ===<br />
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila CONTOR , cu ajutorul caruia vom numara cifrele pe masura ce le vom parcurge. Vom parcurge cifrele numarului incepand cu ultima cifra , si pentru fiecare cifra accesata, vom mari valoarea contorului cu 1.<br />
<br />
==== Pseudocod ====<br />
intreg n, contor<br />
citeste n<br />
contor = 1<br />
cat_timp ( n > 9 ) executa<br />
contor = contor + 1<br />
n = n div 10<br />
scrie contor<br />
<br />
==== C ====<br />
<syntaxhighlight><br />
#include<stdio.h><br />
int main(){<br />
int n, contor;<br />
scanf( "%d", &n );<br />
contor = 1;<br />
while( n > 9 ){<br />
contor = contor + 1; <br />
n = n / 10;<br />
}<br />
printf( "%d", contor );<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
==== C++ ====<br />
<syntaxhighlight><br />
include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, contor;<br />
cin >> n;<br />
contor = 0;<br />
while( n > 0 ){<br />
contor = contor + 1; <br />
n = n / 10;<br />
}<br />
cout << contor;<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Algoritmul de mai sus ne da raspunsul corect pentru n = 0?<br />
<syntaxhighlight><br />
include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, contor;<br />
cin >> n;<br />
contor = 1;<br />
while( n > 9 ){<br />
contor = contor + 1; <br />
n = n / 10;<br />
}<br />
cout << contor;<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Cate cifre sunt egale cu o cifra k ===<br />
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. De asemenea, vom avea nevoie sa numaram cifrele care indeplinesc conditia data, folosind o variabila contor. In plus, vom avea nevoie sa testam daca o anumita cifra indeplineste conditia ceruta, si numai daca conditia este adevarata sa marim valoarea contorului.<br />
<br />
==== Pseudocod ====<br />
contor <- 0;<br />
cat_timp( n > 0 ) executa<br />
daca ( n mod 10 = k ) atunci<br />
contor <- contor + 1<br />
n <- n div 10<br />
scrie contor<br />
<br />
==== C ====<br />
<syntaxhighlight><br />
#include <stdio.h><br />
<br />
int main(){<br />
int n, k, contor;<br />
scanf("%d%d", &n, &k); <br />
if ( n == 0 && k == 0 )<br />
contor = 1;<br />
else<br />
contor = 0;<br />
while( n > 0 ){<br />
if( n % 10 == k )<br />
contor ++;<br />
n = n / 10;<br />
}<br />
printf( "%d", contor );<br />
}<br />
</syntaxhighlight><br />
'''C++'''<br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, k, contor;<br />
cin >> n >> k; <br />
if ( n == 0 && k == 0 )<br />
contor = 1;<br />
else<br />
contor = 0;<br />
while( n > 0 ){<br />
if( n % 10 == k )<br />
contor ++;<br />
n = n / 10;<br />
}<br />
cout << contor;<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Sunt toate cifrele lui n pare? ===<br />
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila STEAG (SEMN) , cu ajutorul caruia vom identifica daca numarul are o cifra care nu respecta conditia data. Vom parcurge toate cifrele numarului si de fiecare data cand vom gasi o cifra care nu respecta conditia( nu este para) vom seta valoarea steguletului pe 0 (codificare a raspunsului NU, nu este ok numarul). Initial valoarea steguletului va fi setata pe 1 (codificare a raspunsului DA; presupunem ca numarul are numai cifre pare, adica este ok)<br />
Variabila cu rol de steag este gasit. <br />
<br />
==== Pseudocod ====<br />
gasit = 1;<br />
cat_timp( n > 0 ) executa<br />
daca( n mod 2 == 1 )<br />
gasit = 0<br />
n<-n div 10;<br />
daca ( gasit == 0 )<br />
scrie “nu sunt toate pare”<br />
altfel<br />
scrie “sunt toate pare”<br />
<br />
==== C ====<br />
<syntaxhighlight><br />
gasit = 0; // pp ca numarul nu are cifre impare ( toate cifrele sunt pare )<br />
while( n > 0 && gasit == 0 ) {<br />
if( n % 2 == 1 ) // dc am gasit o cifra impara<br />
gasit = 1; // numarul are cifre impare<br />
n = n / 10;<br />
}<br />
if( gasit == 1 )<br />
cout << “nu sunt toate pare”;<br />
else<br />
cout << “sunt toate pare”;<br />
</syntaxhighlight><br />
<br />
Varianta condensata:<br />
<syntaxhighlight> <br />
while( n > 0 && n % 2 == 0 ) // cat timp am cifre in n si ultima nu e impara<br />
n = n / 10; <br />
if( n > 0 )<br />
printf("nu sunt toate pare");<br />
else<br />
printf("sunt toate pare");<br />
</syntaxhighlight><br />
=== Afisare cifre de la stanga la dreapta ===<br />
<syntaxhighlight>using namespace std;<br />
<br />
int main(){<br />
int n;<br />
cin >> n;<br />
int p = 1000000000;<br />
while ( p > n )<br />
p = p / 10;<br />
while ( p > 0 ){<br />
cout << n / p << " ";<br />
n = n % p;<br />
p = p / 10;<br />
}<br />
return 0;<br />
}</syntaxhighlight><br />
<br />
===Cifra maxima ===<br />
Se citeste un numar n, natural. Sa se afiseze cifra cea mai mare care apare in numarul n.<br />
<br />
<syntaxhighlight><br />
#include <stdio.h><br />
<br />
int main() {<br />
int n, cmax, f, nc;<br />
///citim numarul n ca numar intreg<br />
scanf( "%d", &n );<br />
///calculam cea mai mare cifra a sa<br />
cmax = n % 10;<br />
n = n / 10;<br />
while( n > 0 ){<br />
if( n % 10 > cmax )<br />
cmax = n % 10;<br />
n = n / 10;<br />
}<br />
<br />
printf( "%d\n", cmax );<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
===Cifra maxima si frecventa acestuia ===<br />
* 1. Se citeste un numar n. Afisati cifra maxima si specificati de cate ori apare aceasta in numar.<br />
<br />
<br />
<syntaxhighlight><br />
#include <stdio.h><br />
<br />
int main() {<br />
int n, cmax, f, nc;<br />
///citim numarul n ca numar intreg<br />
scanf( "%d", &n );<br />
nc = n;<br />
///calculam cea mai mare cifra a sa<br />
cmax = n % 10;<br />
n = n / 10;<br />
while( n > 0 ){<br />
if( n % 10 > cmax )<br />
cmax = n % 10;<br />
n = n / 10;<br />
}<br />
///calculam de cate ori apare cifra cmax in n<br />
f = 0;<br />
while( nc > 0 ){<br />
if( nc % 10 == cmax )<br />
f = f + 1;<br />
nc = nc / 10;<br />
}<br />
printf( "%d %d\n", cmax, f );<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight><br />
#include <stdio.h><br />
<br />
int main() {<br />
int n, cmax, f, uc;<br />
<br />
///citim numarul n ca numar intreg<br />
scanf( "%d", &n );<br />
<br />
///calculam cea mai mare cifra a sa cmax, si de cate ori apare f<br />
cmax = n % 10; // cifra maxima presupun a fi ultima cifra<br />
f = 1; // aceasta apare deocamdata odata<br />
n = n / 10; // scoatem din numar ultima cifra<br />
while ( n > 0 ){ // cata vreme am cifre in numar<br />
if ( n % 10 > cmax ){ // compar ultima cifra a numarului cu cifra maxima<br />
cmax = n % 10; // daca e mai mare, modific valoarea din maxim<br />
f = 1; // noul maxim apare deocamdata o data<br />
}<br />
else if ( n % 10 == cmax ) // daca am gasit o val egala cu maximul<br />
f = f + 1; // cresc frecventa maximului<br />
n = n / 10; // tai ultima cifra din n<br />
}<br />
printf( "%d %d\n", cmax, f );<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Inversul unui numar ===<br />
[[Image:sl-rasturnat-n.gif|frame|none|Schemă logică]]<br />
<br />
'''Pseudocod'''<br />
intreg n, r;<br />
citeste n<br />
r = 0;<br />
cat_timp ( n > 0 ) executa<br />
r = r * 10 + n mod 10 <br />
n = n div 10<br />
scrie r<br />
<br />
'''C'''<br />
<syntaxhighlight><br />
int n, r;<br />
<br />
scanf( "%d", &n );<br />
r = 0;<br />
while ( n > 0 ) {<br />
r = r * 10 + n % 10; <br />
n = n / 10;<br />
}<br />
printf( "Rasturnatul lui n este %d\n", r );<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
=== Palindrom ===<br />
Definiție: un număr palindrom (sau simetric) este un număr care este identic cu răsturnatul lui. Cu alte cuvinte el arată la fel dacă îi scriem cifrele de la stînga la dreapta sau de la dreapta la stînga. Exemple de numere palindrom sînt 1221, 5229225, 27272, 44, 1. Problemă: să se determine dacă un număr n este palindrom.<br />
Rezolvare: vom calcula răsturnatul lui n în variabila r. Dacă cele două numere sînt egale înseamnă ca numărul este palindrom. Trebuie să acordăm atenție faptului că n va fi distrus în timpul calculului, drept pentru care îi vom face o copie în nc.<br />
<br />
<syntaxhighlight><br />
#include <stdio.h><br />
<br />
int main() {<br />
int n, nc, r;<br />
<br />
scanf( "%d", &n );<br />
nc = n;<br />
r = 0;<br />
while ( n > 0 ) {<br />
r = r * 10 + n % 10;<br />
n = n / 10;<br />
}<br />
if ( nc == r )<br />
printf( "%d este palindrom\n", nc );<br />
else<br />
printf( "%d nu este palindrom\n", nc );<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
Algoritmul clasic verifică dacă numărul este egal cu răsturnatul său:<br />
Avem şi o metodă mai apropiată de cea originală, în care răsturnăm numărul numai pînă la jumate:<br />
<syntaxhighlight>#include<stdio.h><br />
<br />
int main(){<br />
long long n, r;<br />
scanf("%lld", &n );<br />
<br />
if ( n > 0 && n % 10 == 0 )<br />
printf("NU\n");<br />
else {<br />
r = 0;<br />
while( n > r ){<br />
r = r * 10 + n % 10;<br />
n = n / 10;<br />
}<br />
// cand numarul are un numar par de cifre testam daca p == r<br />
// cand numarul are un numar impar de cifre testam daca p == r / 10<br />
if( n == r || n ==(r /10))<br />
printf("DA\n");<br />
else<br />
printf("NU\n");<br />
}<br />
return 0;<br />
}</syntaxhighlight><br />
Metoda: Rasturnam numarul pana la jumatate; Cum obtinem cele 2 jumatati? <br />
Vom muta in r cifre din n pana cand r devine mai mare ca n. Atentie la numerele cu zerouri la coada. Ex: 5500<br />
<br />
=== Permutari circulare a cifrelor numarului catre dreapta ===<br />
Sa se afiseze toate numerele obtinute prin permutarea cifrelor lui n.<br />
Ex: pentru n = 12345 vom afisa: 51234 45123 34512 23451 <br />
<syntaxhighlight><br />
#include <iostream><br />
#include <iostream><br />
using namespace std;<br />
<br />
int main(){<br />
long long n;<br />
cin >> n;<br />
<br />
long long p = 1e12;<br />
<br />
while ( p > n )<br />
p /= 10;<br />
<br />
long long p2 = 10;<br />
while ( p > 1 ){<br />
cout << n % p2 * p + n / p2 << " ";<br />
p /= 10;<br />
p2 *= 10;<br />
}<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
=== Permutari circulare a cifrelor numarului catre stanga ===<br />
Sa se afiseze toate numerele obtinute prin permutarea cifrelor lui n.<br />
Ex: pentru n = 12345 vom afisa: 23451 34512 45123 51234<br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
<br />
int main(){<br />
long long n;<br />
cin >> n;<br />
<br />
long long p = 1e12;<br />
<br />
while ( p > n )<br />
p /= 10;<br />
<br />
long long p2 = 10;<br />
while ( p > 0 ){<br />
cout << n % p * p2 + n / p << " ";<br />
p /= 10;<br />
p2 *= 10;<br />
}<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
== LABORATOR ==<br />
===Eliminarea primei cifre===<br />
Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.<br />
==== Varianta1 ====<br />
Vom construi un numar nou, adaugand la noul numar toate cifrele lui n, mai putin prima cifra. <br />
<br />
{| class="wikitable" <br />
!Pseudocod<br />
!C/C++<br />
|- style="vertical-align:top;"<br />
|<br />
integer n, p, x;<br />
read n;<br />
p ← 1;<br />
x ← 0;<br />
while (n > 9) do<br />
x ← (n mod 10) * p + x; <br />
p ← p * 10;<br />
n ← n div 10;<br />
write x;<br />
| <syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, p, x;<br />
cout << "Dati un numar n:" << endl;<br />
cin >> n;<br />
p = 1;<br />
x = 0;<br />
while (n > 9){<br />
x = (n % 10) * p + x;<br />
p = p * 10;<br />
n = n / 10;<br />
}<br />
cout << "Numarul rezultat este: " << x;<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
==== Varianta2 ====<br />
Vom calcula puterea lui 10 la care trebuie sa impartim numarul astfel incat sa eliminam prima cifra.<br />
<br />
{| class="wikitable" <br />
!Pseudocod<br />
!C/C++<br />
|- style="vertical-align:top;"<br />
| <br />
integer n, p;<br />
read n;<br />
p = 1000000000;<br />
while(p>n)<br />
p = p / 10;<br />
write n % p;<br />
| <syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, p;<br />
cin >> n;<br />
p = 1000000000;<br />
while(p>n)<br />
p = p / 10;<br />
cout << n % p;<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
|}<br />
<br />
=== Numar corect scris in baza b ===<br />
* 3. Se citeste un numar n. Verificati daca este un numar scris corect in baza b, unde b <=10.<br />
<br />
<syntaxhighlight><br />
int n;<br />
cin >> n;<br />
cin>>b; //citim b<br />
ok = 1; //presupunem ca e scris corect; folosim stegulet<br />
while ( n > 0 ){ //si mai bine ar fi sa ne oprim cand gasim o cifra neok: while ( n > 0 && ok==1)<br />
pcif = n % 10;<br />
if ( pcif > = b )//daca am gasit o cifra >b <br />
ok = 0; //setam steguletul pe 0<br />
n = n % 10; <br />
}<br />
if( ok == 1 )<br />
cout << " nr este corect in baza " << b;<br />
else<br />
cout << " nr nu este corect in baza"<< b;<br />
</syntaxhighlight><br />
<br />
Putem de asemenea sa scriem algoritmul de mai sus fara a folosi o variabila stegulet; <br />
<syntaxhighlight><br />
<br />
while( n > 0 && n % 10 < b) //cata vreme am cifre si ultima cifra e ok<br />
n = n / 10;<br />
if( n == 0 )<br />
cout << "e ok";<br />
else <br />
cout << "nu e ok";<br />
</syntaxhighlight><br />
<br />
=== Extragere cifre pare din n ===<br />
* 2. Se citeste un numar n, de maxim 9 cifre. Afisati numarul care contine, in aceeasi ordine doar cifrele pare ale lui n. Ex: n = 12345, Se va afisa 24;<br />
<br />
==== Varianta1 ====<br />
<syntaxhighlight><br />
intreg n, p, ucif, nr; <br />
citeste n; // citim numarul n ca numar intreg<br />
p = 1;<br />
nr = 0; // nr pe care il construim adaugand doar cifrele pare<br />
cat_timp ( n > 0 ) executa<br />
ucif = n mod 10; // extragem ultima cifra a lui n<br />
daca ( ucif mod 2 == 0 ) atunci // daca cifra este para<br />
nr = ucif * p + nr; // adaugam cifra para in fata numarului nr<br />
p = p * 10; // calc puterea cu care trebuie sa inmultim la pasul urmator<br />
n = n div 10; // taiem ultima cifra din n<br />
<br />
scrie nr;<br />
</syntaxhighlight><br />
<br />
<syntaxhighlight><br />
#include <stdio.h><br />
<br />
int main() {<br />
int n, p, ucif, nr;<br />
<br />
///citim numarul n ca numar intreg<br />
scanf( "%d", &n );<br />
<br />
p = 1;<br />
nr = 0; /// nr pe care il construim adaugand doar cifrele pare<br />
while ( n > 0 ){<br />
ucif = n % 10; /// extragem ultima cifra a lui n<br />
if ( ucif % 2 == 0){ /// daca cifra este para<br />
nr = ucif * p + nr; /// adaugam cifra para in fata numarului nr<br />
p = p * 10; /// calculam puterea cu care trebuie sa inmultim la pasul urmator<br />
}<br />
n = n / 10; /// taiem ultima cifra din n<br />
}<br />
<br />
printf( "%d", nr );<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
==== Varianta2 ====<br />
Varianta cu citire/afisare date din/in fisier varianta C.<br />
<syntaxhighlight><br />
#include <stdio.h><br />
#include <stdlib.h><br />
<br />
int main(){<br />
int n, p10, nr, pcif;<br />
FILE *fin = fopen("date.in", "r"); /// r de la read<br />
FILE *fout = fopen ("date.out", "w"); /// w de la write<br />
/// cititm n din fisierul de intrare<br />
fscanf(fin,"%d", &n);<br />
<br />
///calculeaza puterea lui 10 care aproximeaza pe n ( mai mica sau egala cu n)<br />
p10 = 100000000;<br />
while ( p10 > n )<br />
p10 = p10 /10;<br />
<br />
///construiesc numarul cerut parcurgand cifrele incepand de la prima cifra a sa<br />
nr = 0;<br />
while ( p10 > 0 ){ /// ATENTIE! n>0 CA NU MERGE PT NUMERE CU ZEROURI LA COADA<br />
pcif = n / p10; /// extrag prima cifra din n<br />
if ( pcif % 2 == 0) /// daca cifra este para<br />
nr = nr * 10 + pcif; /// adaug cifra la coada lui nr<br />
n = n % p10; /// scot prima cifra din n<br />
p10 = p10 / 10; /// ajustez puterea lui 10<br />
}<br />
<br />
///afisam nr in fisierul; de iesire<br />
fprintf(fout, "%d", nr);<br />
fclose(fin);<br />
fclose(fout);<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
===Numere palindrom apropiate de n===<br />
Varianta1: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n, '''diferit de n'''.<br/><br />
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122<br/><br />
Ex2: n = 121 , afisam 111 131; 111, 131 sunt la aceeasi distanta fata de n<br/><br />
Ex3: n = 247 , afisam 242 252; 242, 252 sunt la aceeasi distanta fata de n<br/><br />
<br />
<syntaxhighlight><br />
#include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, cn1, cn2, c1, c2, palin1, palin2, inv;<br />
cin>>n; //citim n<br />
cn1=n-1;<br />
cn2=n+1;<br />
palin1 = palin2 = -1; //nu le-am gasit inca<br />
while (palin1 == -1 && palin2 == -1){ //inca nu le-am gasit<br />
//verific daca cn1 e palindrom<br />
c1=cn1;<br />
inv = 0;<br />
while (c1 > 0){<br />
inv = inv * 10 + c1 % 10;<br />
c1 = c1 /10; //div<br />
}<br />
if (cn1 == inv ){<br />
palin1 = cn1;<br />
}<br />
//verific daca cn2 e palindrom<br />
c2=cn2;<br />
inv = 0;<br />
while (c2 > 0){<br />
inv = inv * 10 + c2 % 10;<br />
c2 = c2 /10; //div<br />
}<br />
if (cn2 == inv ){<br />
palin2 =cn2;<br />
}<br />
cn1 = cn1-1;<br />
cn2 = cn2+1;<br />
}<br />
if (palin1!=-1 && palin2!=-1) //cand am gasit 2 la aceeasi distanta<br />
cout<<palin1<<palin2;<br />
else if (palin1!=-1) //daca am gasit doar pe palin1<br />
cout<<palin1;<br />
else<br />
cout<<palin2;<br />
<br />
return 0;<br />
}<br />
<br />
</syntaxhighlight><br />
<br />
Varianta2: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n.<br/><br />
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122<br/><br />
Ex2: n = 121 , afisam 121 <br/><br />
Ex3: n = 247 , afisam 242 252; 242 si 252 sunt la aceeasi distanta fata de n<br/><br />
<syntaxhighlight><br />
<br />
#include <iostream><br />
using namespace std;<br />
int main(){<br />
int n, cn1, cn2, c1, c2, palin1, palin2, inv;<br />
cin>>n; //citim n<br />
cn1=n;<br />
cn2=n;<br />
palin1 = palin2 = -1; //nu le-am gasit inca<br />
while (palin1 == -1 && palin2 == -1){ //inca nu le-am gasit<br />
//verific daca cn1 e palindrom<br />
c1=cn1;<br />
inv = 0;<br />
while (c1 > 0){<br />
inv = inv * 10 + c1 % 10;<br />
c1 = c1 /10; //div<br />
}<br />
if (cn1 == inv ){<br />
palin1 = cn1;<br />
}<br />
//verific daca cn2 e palindrom<br />
c2=cn2;<br />
inv = 0;<br />
while (c2 > 0){<br />
inv = inv * 10 + c2 % 10;<br />
c2 = c2 /10; //div<br />
}<br />
if (cn2 == inv ){<br />
palin2 =cn2;<br />
}<br />
cn1 = cn1-1;<br />
cn2 = cn2+1;<br />
}<br />
if (palin1!=-1 && palin2!=-1){ //cand am gasit 2 la aceeasi distanta<br />
if(palin1 == palin2) //cand <br />
cout<<palin1;<br />
else<br />
cout<<palin1<<" "<<palin2;<br />
}<br />
<br />
else if (palin1!=-1) //daca am gasit doar pe palin1<br />
cout<<palin1;<br />
else<br />
cout<<palin2;<br />
<br />
return 0;<br />
}<br />
</syntaxhighlight><br />
<br />
= Tema = <br />
== Teorie == <br />
*https://www.pbinfo.ro/probleme/66/numaruldecifre - Teorie<br />
*https://www.pbinfo.ro/probleme/77/ultimacifrapara<br />
*https://www.pbinfo.ro/probleme/65/produscifreimpare<br />
*https://www.pbinfo.ro/probleme/3078/prod-k<br />
*https://www.pbinfo.ro/probleme/942/cifre23<br />
*https://www.pbinfo.ro/probleme/107/aparitii<br />
*https://www.pbinfo.ro/probleme/68/ciframaxima - Teorie<br />
*https://www.pbinfo.ro/probleme/121/ciframaxima2 - Teorie<br />
*https://www.pbinfo.ro/probleme/2288/cifraimparamaxima<br />
*https://www.pbinfo.ro/probleme/3254/prod-pi<br />
*https://www.pbinfo.ro/probleme/69/oglindit - Teorie<br />
<br />
== Laborator ==<br />
* https://www.pbinfo.ro/probleme/108/aparitii2<br />
* https://www.pbinfo.ro/probleme/2660/produsprimeledouacifre<br />
* https://www.pbinfo.ro/probleme/4212/inccifpare<br />
* Sa se afiseze cel mai mare numar palindrom care se poate scrie ca produs de 2 numere cu k cifre (mai grea, nu mai stiu unde e publicata).<br />
<br />
== Probleme de concurs ==<br />
* [https://www.pbinfo.ro/probleme/3384/codjoc codjoc]<br />
* [http://varena.ro/problema/semipalindrom semipalindrom]<br />
* [http://varena.ro/problema/parola parola]<br />
* [http://varena.ro/problema/permcif permcif]<br />
<br />
== Codeforces ==<br />
* [http://codeforces.com/contest/1247/problem/A Forgetting Things]</div>Bella