Clasa a XII-a · Recapitulare pentru bacalaureatRead in English
Fișier — cel mai mare și cel mai mic număr format din cifre date în C++
În engleză: File: the largest and smallest number formed from given digits
Ideea
Cerința (tip subiectul III.3): fișierul date.in conține cel mult 10^6 cifre separate prin spații. Folosind toate cifrele, fiecare o singură dată, afișați pe prima linie cel mai mare număr care se poate forma, iar pe a doua cel mai mic număr fără zerouri nesemnificative (dacă toate cifrele sunt 0, numărul este 0). Eficiența: nu sortăm cifrele; un vector de frecvență cu 10 poziții le numără la citire. Cel mai mare număr scrie cifrele de la 9 la 0, de câte ori apar. Cel mai mic începe cu cea mai mică cifră nenulă, continuă cu toate zerourile și apoi cu restul cifrelor crescător.
Descrierea în engleză
The task (exam part III.3 style): the file date.in holds at most 10^6 digits separated by spaces. Using all the digits, each exactly once, print on the first line the largest number that can be formed, and on the second the smallest number without leading zeros (if all digits are 0, the number is 0). Efficiency: we do not sort the digits; a frequency array with 10 positions counts them while reading. The largest number writes the digits from 9 down to 0, as many times as they appear. The smallest starts with the smallest non-zero digit, continues with all the zeros and then with the remaining digits in increasing order.
- Complexitate
- O(n) timp, O(10) memorie
- Clasa
- Clasa a XII-a (Grade 12)
Exemple
Intrare (date.in)
3 0 9 0 1 3
Ieșire așteptată
933100 100339
Intrare (date.in)
0 0 0
Ieșire așteptată
0 0
Codul C++
Codul complet, cu comentarii în română. Îl poți modifica liber și îl poți reseta oricând.
/*
* Titlu: Fișier — cel mai mare și cel mai mic număr format din cifre date
* Clasa: 12
* Capitol: Recapitulare pentru bacalaureat
* Descriere: Cerința (tip subiectul III.3): fișierul date.in conține cel mult 10^6
* cifre separate prin spații. Folosind toate cifrele, fiecare o singură
* dată, afișați pe prima linie cel mai mare număr care se poate forma,
* iar pe a doua cel mai mic număr fără zerouri nesemnificative (dacă
* toate cifrele sunt 0, numărul este 0). Eficiența: nu sortăm cifrele;
* un vector de frecvență cu 10 poziții le numără la citire. Cel mai mare
* număr scrie cifrele de la 9 la 0, de câte ori apar. Cel mai mic începe
* cu cea mai mică cifră nenulă, continuă cu toate zerourile și apoi cu
* restul cifrelor crescător.
* Complexitate: O(n) timp, O(10) memorie
*
* Exemplu
* Intrare: 3 0 9 0 1 3
* Ieșire:
* 933100
* 100339
*
* Exemplu
* Intrare: 0 0 0
* Ieșire:
* 0
* 0
*/
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
ifstream fin("date.in");
int f[10] = {0}, c;
while (fin >> c)
f[c]++;
int nenule = 0;
for (int i = 1; i <= 9; i++)
nenule += f[i];
if (nenule == 0)
{
cout << "0\n0\n";
return 0;
}
// cel mai mare număr
for (int i = 9; i >= 0; i--)
for (int k = 0; k < f[i]; k++)
cout << i;
cout << '\n';
// cel mai mic număr: prima cifră nenulă minimă, apoi zerourile, apoi restul
int prima = 1;
while (f[prima] == 0)
prima++;
f[prima]--;
cout << prima;
for (int i = 0; i <= 9; i++)
for (int k = 0; k < f[i]; k++)
cout << i;
cout << '\n';
return 0;
}
Rulează pe un g++ adevărat (C++17, -O2) prin Compiler Explorer. Programele trebuie să se termine repede: există o limită de timp.