Informatică, întrebare adresată de costinsergiuciu, 8 ani în urmă

Se citesc n numere naturale de maxim 9 cifre. Pentru fiecare număr citit, să se calculeze cifra maximă
și cifra minimă, precum și numărul lor de apariții. Dacă toate cifrele sunt identice, se va afișa mesajul
“CIFRE EGALE “.
Exemplu: pentru n=3, dacă se citesc numerele
5347372 se va afișa cifra maxima 7 numar de aparitii 2, cifra minima 2 numar de aparitii 1
22222 se va afișa cifre egale
646464 se va afișa cifra maxima 6 numar de aparitii 3, cifra minima 4 numar de aparitii 3

Răspunsuri la întrebare

Răspuns de Petruccinator
1

#include <iostream>

#include <vector>

void diag(const std::string& str) {

char min = str[0], max = str[0];

size_t min_cnt = 1, max_cnt = 1;

for (size_t i = 1; i < str.size(); ++i) {

 if (str[i] < min) {

  min = str[i];

  min_cnt = 1;

 }

 else if (str[i] == min)

  ++min_cnt;

 

 if (str[i] > max) {

  max = str[i];

  max_cnt = 1;

 }

 else if (str[i] == max)

  ++max_cnt;

}

if (max == min)

 std::cout << "CIFRE EGALE\n";

else

 std::cout

 << "Cifra maxima: " << max << " Numar de aparitii: " << max_cnt

 << " Cifra minima: " << min << " Numar de aparitii: " << min_cnt << '\n';

}

int main() {

size_t i, n;

std::cin >> n;

std::vector<std::string> vec(n);

for (i = 0; i < n; ++i)

 std::cin >> vec[i];

 

for (i = 0; i < n; ++i)

 diag(vec[i]);

}


costinsergiuciu: Multumesc!
costinsergiuciu: Ai putea sa mi explici ce ai facut aici?
Petruccinator: Despre program:
1. Am utilizat std::string in loc de int pentru a usura procesul de determinare a cifrei max/min.
1.1 Convertirea din text (secvente de caractere introduse de la tastatura) intr-un numar este o operatie costistitoare si necesita mai mult timp de executie.
2. Am utilizat std::vector pentru un vector dinamic. Inlocuieste-l cu std::string[NMAX] daca vrei static. Prefer dinamic ca sa nu poluez segmentul de date a programului (fac economie de RAM).
Petruccinator: 3. In functia diag, parametrul este de tip referinta, ca sa nu creez o copie.
4. Tipul size_t reprezinta un numar natural (unsigned), cu dimensiunea maxima de octeti.

Despre algoritm:
1. Daca cifra maxima si minima sunt aceleasi, inseamna ca toate cifrele, dintr-un numar, sunt egale.
2. Daca a fost gasita o noua cifra maxima/minima, nr. de aparitie se reincepe de la 1.
3. Daca a fost gasita o cifra egala cu cea maxima/minima, nr. de aparitie se adauga cu 1.
Petruccinator: Practic, acest algoritm suporta si numerele ce au mai mult decat 9 cifre.
Alte întrebări interesante