Clasa a V-a lecția 6 S7
Tema6 Rezolvari
- (usoara) 2 la n :Sa se calculeze 2 la puterea n.
- (usoara) Eliminarea primei cifre: Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.
- (medie) Extragere cifre pare : Se citeste un numar n, de maxim 9 cifre dintr-un fisier "date.in". Afisati numarul care contine, in aceeasi ordine doar cifrele pare ale lui n, intr-un fisier "date.out". Ex: n= 12345, Se va afisa 24;
- (medie) Cifra de control: Se citeste un numar n. Afisati cifra de control a numarul n. Cifra de control se obtine prin adunarea repetata a cifrelor numarului pana cand se obtine o singura cifra. Ex: n=193, s=1+9+3=13, s=1+3=4
- (dificila - optional) Numere palindrom apropiate de n: Se citeste un numar n. Sa se afiseze cel mai apropiat fata de n numar palindrom.
Ex1: 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122. Ex2: 452 , afisam 454; nr 452 este cuprins intre 444 si 454.
2 la n
#include <stdio.h>
int main() {
int n, contor;
scanf( "%d", &n );
contor = 0;
p = 1;
while ( contor < n ) {
p = p * 2;
contor= contor + 1;
}
printf( "%d ", p );
return 0;
}
Extragere cifre pare din n
- 2. Se citeste un numar n, de maxim 9 cifre dintr-un fisier "date.in". Afisati numarul care contine, in aceeasi ordine doar cifrele pare ale lui n, intr-un fisier "date.out". Ex: n= 12345, Se va afisa 24;
Varianta1
#include <stdio.h>
int main() {
int n, p, ucif, nr;
///citim numarul n ca numar intreg
scanf( "%d", &n );
p = 1;
nr = 0; /// nr pe care il construim adaugand doar cifrele pare
while ( n > 0 ){
ucif = n % 10; /// extragem ultima cifra a lui n
if ( ucif % 2 == 0){ /// daca cifra este para
nr = ucif * p + nr; /// adaugam cifra para in fata numarului nr
p = p * 10; /// calculam puterea cu care trebuie sa inmultim la pasul urmator
}
n = n / 10; /// taiem ultima cifra din n
}
printf( "%d", nr );
return 0;
}
Varianta2
#include <stdio.h>
int main(){
int n, p, nr, pcif;
FILE *fin = fopen("date.in", "r"); /// r de la read
FILE *fout = fopen ("date.out", "w"); /// w de la write
/// cititm n din fisierul de intrare
fscanf(fin,"%d", &n);
///calculeaza puterea lui 10 care aproximeaza pe n ( mai mica sau egala cu n)
p = 100000000;
while ( p > n )
p = p / 10;
///construiesc numarul cerut parcurgand cifrele incepand de la prima cifra a sa
nr = 0;
while ( p > 0 ){ /// ATENTIE! n>0 CA NU MERGE PT NUMERE CU ZEROURI LA COADA
pcif = n / p; /// extrag prima cifra din n
if ( pcif % 2 == 0) /// daca cifra este para
nr = nr * 10 + pcif;/// adaug cifra la coada lui nr
n = n % p; /// scot prima cifra din n
p = p / 10; /// ajustez puterea lui 10
}
///afisam nr in fisierul; de iesire
fprintf(fout, "%d", nr);
fclose(fin);
fclose(fout);
return 0;
}
Eliminarea primei cifre
Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.
Varianta1
Vom construi un numar nou, adaugand la noul numar toate cifrele lui n, mai putin prima cifra.
Pseudocod | C/C++ |
---|---|
integer n, p, x; read n; p ← 1; x ← 0; while (n > 9) do x ← (n mod 10) * p + x; p ← p * 10; n ← n div 10; write x; |
#include <iostream>
using namespace std;
int main(){
int n, p, x;
cout << "Dati un numar n:" << endl;
cin >> n;
p = 1;
x = 0;
while (n > 9){
x = (n % 10) * p + x;
p = p * 10;
n = n / 10;
}
cout << "Numarul rezultat este: " << x;
return 0;
} |
Varianta2
Vom calcula puterea lui 10 la care trebuie sa impartim numarul astfel incat sa eliminam prima cifra.
Pseudocod | C/C++ |
---|---|
integer n, p; read n; p = 1000000000; while(p>n) p = p / 10; write n % p; |
#include <iostream>
using namespace std;
int main(){
int n, p;
cin >> n;
p = 1000000000;
while(p>n)
p = p / 10;
cout << n % p;
return 0;
} |
Cifra de control
Se citeste un numar n. Afisati cifra de control a numarul n. Cifra de control se obtine prin adunarea repetata a cifrelor numarului pana cand se obtine o singura cifra.
Ex: n=193 s=1+9+3=13 s=1+3=4
Rezolvare: Vom calcula mai intai suma cifrelor lui n. Daca suma cifrelor are mai mult de o cifra, atunci copiem valoarea sumei in n si reluam calculul sumei cifrelor, de data aceasta pentru numarul obtinut prin adunarea cifrelor. Vom repeta procedeul pana cand obtinem un numar cu o singura cifra.
#include <iostream>
using namespace std;
int main(){
int n, s;
cout << "Dati un numar n:" << endl;
cin >> n;
//calculam suma cifrelor
s = 0;
while( n > 0 ){
s = s + n % 10;
n = n / 10;
}
while( s > 9 ){
n = s;
while( n > 0 ){
s = s + n % 10;
n = n / 10;
}
}
cout << "Cifra de control este " << s;
return 0;
}
Numere palindrom apropiate de n
Varianta1: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n, diferit de n.
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122
Ex2: n = 121 , afisam 111 131; 111, 131 sunt la aceeasi distanta fata de n
Ex3: n = 247 , afisam 242 252; 242, 252 sunt la aceeasi distanta fata de n
#include <iostream>
using namespace std;
int main(){
int n, cn1, cn2, c1, c2, palin1, palin2, inv;
cin>>n; //citim n
cn1=n-1;
cn2=n+1;
palin1 = palin2 = -1; //nu le-am gasit inca
while (palin1 == -1 && palin2 == -1){ //inca nu le-am gasit
//verific daca cn1 e palindrom
c1=cn1;
inv = 0;
while (c1 > 0){
inv = inv * 10 + c1 % 10;
c1 = c1 /10; //div
}
if (cn1 == inv ){
palin1 = cn1;
}
//verific daca cn2 e palindrom
c2=cn2;
inv = 0;
while (c2 > 0){
inv = inv * 10 + c2 % 10;
c2 = c2 /10; //div
}
if (cn2 == inv ){
palin2 =cn2;
}
cn1 = cn1-1;
cn2 = cn2+1;
}
if (palin1!=-1 && palin2!=-1) //cand am gasit 2 la aceeasi distanta
cout<<palin1<<palin2;
else if (palin1!=-1) //daca am gasit doar pe palin1
cout<<palin1;
else
cout<<palin2;
return 0;
}
Varianta2: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n.
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122
Ex2: n = 121 , afisam 121
Ex3: n = 247 , afisam 242 252; 242 si 252 sunt la aceeasi distanta fata de n
#include <iostream>
using namespace std;
int main(){
int n, cn1, cn2, c1, c2, palin1, palin2, inv;
cin>>n; //citim n
cn1=n;
cn2=n;
palin1 = palin2 = -1; //nu le-am gasit inca
while (palin1 == -1 && palin2 == -1){ //inca nu le-am gasit
//verific daca cn1 e palindrom
c1=cn1;
inv = 0;
while (c1 > 0){
inv = inv * 10 + c1 % 10;
c1 = c1 /10; //div
}
if (cn1 == inv ){
palin1 = cn1;
}
//verific daca cn2 e palindrom
c2=cn2;
inv = 0;
while (c2 > 0){
inv = inv * 10 + c2 % 10;
c2 = c2 /10; //div
}
if (cn2 == inv ){
palin2 =cn2;
}
cn1 = cn1-1;
cn2 = cn2+1;
}
if (palin1!=-1 && palin2!=-1){ //cand am gasit 2 la aceeasi distanta
if(palin1 == palin2) //cand
cout<<palin1;
else
cout<<palin1<<" "<<palin2;
}
else if (palin1!=-1) //daca am gasit doar pe palin1
cout<<palin1;
else
cout<<palin2;
return 0;
}
Test
Test din pbinfo:
Tema7
Alegeti 3 probleme din runda:
Incercati sa rezolvati acasa problemele din test:
- S7 Problemele din test
Optional: Rezolvati si celelalte 3 probleme din runda din varena