#2111(pbinfo)
Cristina si Alina sunt eleve in clasa a V-a si sunt foarte bune prietene.Le place ca in pauze sa se provoace reciproc cu cate o problema.De sata aceasta, e randul Cristinei sa propuna o problema Alinei. Ea ii cere ca dintr-un set de mai multe numere naturale sa le gaseasca pe cele centrale.Bineinteles ca mai intai ii explica prietenei sale ce este un numar central:un numar care are proprietatea ca, dupa eliminarea primei si a ultimei cifre, se obtine un nou numar care contine numai cifre egale intre ele.Alina, care intre timp a invatat sa programeze, intra imediat in jocul Cristinei, stiind ca va afla imediat rezultatul corect la problema propusa de prietena ei.
Avand la dispozitie un set de numere pe care le primeste pentru verificare, Alina trebuie sa spuna cate dintre acestea sunt numere centrale.
Răspunsuri la întrebare
Răspuns de
3
#include <iostream>
using namespace std;
int main() {
int n, nr = 0;
cin >> n;
for(int i = 0; i < n; i++) {
int val;
cin >> val;
val = val / 10; // am taiat ultima cifra
while(val > 9 && val % 10 == val % 100 / 10) // cat timp numarul are macar 2 cifre si ultima cifra este egala cu penultima, se taie ultima cifra
val /= 10;
if(val <= 99) // daca nr mai are 2 cifre : o cifra (din cele egale) si prima cifra, respecta conditia
nr++;
}
cout << nr;
return 0;
}
using namespace std;
int main() {
int n, nr = 0;
cin >> n;
for(int i = 0; i < n; i++) {
int val;
cin >> val;
val = val / 10; // am taiat ultima cifra
while(val > 9 && val % 10 == val % 100 / 10) // cat timp numarul are macar 2 cifre si ultima cifra este egala cu penultima, se taie ultima cifra
val /= 10;
if(val <= 99) // daca nr mai are 2 cifre : o cifra (din cele egale) si prima cifra, respecta conditia
nr++;
}
cout << nr;
return 0;
}
danamocanu71:
Multumesc frumos
Răspuns de
3
Ne dam seama din enunt ca avem cateva cazuri limita si depinde cum le tratam.
In primul rand, numerele de o cifra si 2 cifre nu le numaram, pentru ca daca am scoate prima si ultima cifra nu am mai ramane cu nimic
Acum vin numerele de 3 cifre. Daca scoatem prima si a treia cifra, atunci ramane cu o singura cifra care este egala cu ea insasi. Deci o putem numara intotdeauna.
De la 4 cifre in sus avem acelasi caz. Eliminam prima si ultima cifra
deci avem un numar de forma abbbc care il putem numara
mai intai ultima cifra nu ne intereseaza deci putem imparti numarul la 10 si obtinem abbbc/10=abbb
Acum prima cifra pe care o luam ar trebui sa fie egala cu toate cele care vor veni, deci o putem numi cifra de referinta adica cifra_ref
Aici folosim functia rest pentru a extrage exact valoarea cifrei
cifra_ref=abbb%10=b
si mai scoatem o cifra abbb/10=abb
Cifra actuala a lui o notam cifra_actuala
Atunci avem: cifra_actuala=abb%10=b
Comparam cifra_actuala cu cifra de referinta: daca sunt egale, continuam cautarea, daca nu, ne oprim, nu mai are rost sa cautam pentru ca deja stim ca nu este un numar central
Daca sunt egale continuam pana ajungem cu impartirea la o singura cifra, adica numarul trebuie sa fie mereu mai mare decat 10
Ai codul ceva mai jos
#include <iostream>
#include <fstream>
using namespace std;
int main(){
//declarare fisiere citire
ifstream fic("centrale.in");
ofstream foc("centrale.out");
//copie_val este folosit pentru a memora valoarea numarului este folosit strict pentru testare
int a[100],copie_val,i,n,cifra_actuala,cifra_ref,cifre_egale,numarator=0;
//nr de elemetne
fic>>n;
for(i=0;i<n;i++){
//citire numar
fic>>a[i];
//salvam valoarea numarului
copie_val=a[i];
//scoatem ultima cifra
a[i]=a[i]/10;
//aflam cifra de referinta
cifra_ref=a[i]%10;
//cea actuala este chiar cea de referinta
cifra_actuala=cifra_ref;
//daca am ramas cel putin cu 2 cifre, mai mare decat 10
if(a[i]>=10){
//pornim cu faptul ca cifra actuala este egala cu cea de referinta
cifre_egale=1;
//cat timp este mai mare ca 10, adica nu ajungem la prima cifra
//si cifrele sunt egale
while(a[i]>=10&&cifre_egale==1){
//scoate urmataorea cifra
cifra_actuala=a[i]%10;
//daca nu sunt egale, marcheaza asta pentru a opri cautarea
if(cifra_actuala!=cifra_ref){
cifre_egale=0;
}
//altfel treci la urmatoarea cifra
else{
a[i]=a[i]/10;
}
}
//daca cifrele au fost intotdeauna cu valoarea de referinta, incrementeaza numarator
if(cifre_egale==1){
//foc<<copie_val<<" ";
numarator++;
}
}
}
foc<<numarator;
return 0;
}
In primul rand, numerele de o cifra si 2 cifre nu le numaram, pentru ca daca am scoate prima si ultima cifra nu am mai ramane cu nimic
Acum vin numerele de 3 cifre. Daca scoatem prima si a treia cifra, atunci ramane cu o singura cifra care este egala cu ea insasi. Deci o putem numara intotdeauna.
De la 4 cifre in sus avem acelasi caz. Eliminam prima si ultima cifra
deci avem un numar de forma abbbc care il putem numara
mai intai ultima cifra nu ne intereseaza deci putem imparti numarul la 10 si obtinem abbbc/10=abbb
Acum prima cifra pe care o luam ar trebui sa fie egala cu toate cele care vor veni, deci o putem numi cifra de referinta adica cifra_ref
Aici folosim functia rest pentru a extrage exact valoarea cifrei
cifra_ref=abbb%10=b
si mai scoatem o cifra abbb/10=abb
Cifra actuala a lui o notam cifra_actuala
Atunci avem: cifra_actuala=abb%10=b
Comparam cifra_actuala cu cifra de referinta: daca sunt egale, continuam cautarea, daca nu, ne oprim, nu mai are rost sa cautam pentru ca deja stim ca nu este un numar central
Daca sunt egale continuam pana ajungem cu impartirea la o singura cifra, adica numarul trebuie sa fie mereu mai mare decat 10
Ai codul ceva mai jos
#include <iostream>
#include <fstream>
using namespace std;
int main(){
//declarare fisiere citire
ifstream fic("centrale.in");
ofstream foc("centrale.out");
//copie_val este folosit pentru a memora valoarea numarului este folosit strict pentru testare
int a[100],copie_val,i,n,cifra_actuala,cifra_ref,cifre_egale,numarator=0;
//nr de elemetne
fic>>n;
for(i=0;i<n;i++){
//citire numar
fic>>a[i];
//salvam valoarea numarului
copie_val=a[i];
//scoatem ultima cifra
a[i]=a[i]/10;
//aflam cifra de referinta
cifra_ref=a[i]%10;
//cea actuala este chiar cea de referinta
cifra_actuala=cifra_ref;
//daca am ramas cel putin cu 2 cifre, mai mare decat 10
if(a[i]>=10){
//pornim cu faptul ca cifra actuala este egala cu cea de referinta
cifre_egale=1;
//cat timp este mai mare ca 10, adica nu ajungem la prima cifra
//si cifrele sunt egale
while(a[i]>=10&&cifre_egale==1){
//scoate urmataorea cifra
cifra_actuala=a[i]%10;
//daca nu sunt egale, marcheaza asta pentru a opri cautarea
if(cifra_actuala!=cifra_ref){
cifre_egale=0;
}
//altfel treci la urmatoarea cifra
else{
a[i]=a[i]/10;
}
}
//daca cifrele au fost intotdeauna cu valoarea de referinta, incrementeaza numarator
if(cifre_egale==1){
//foc<<copie_val<<" ";
numarator++;
}
}
}
foc<<numarator;
return 0;
}
Alte întrebări interesante
Franceza,
8 ani în urmă
Chimie,
8 ani în urmă
Limba română,
8 ani în urmă
Matematică,
9 ani în urmă
Matematică,
9 ani în urmă
Geografie,
9 ani în urmă