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

O(n)C++1766 de linii2 exemplefolosește date.in / date.out

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

Exemplul 1

Intrare (date.in)

3 0 9 0 1 3

Ieșire așteptată

933100
100339
Exemplul 2

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.

fisier-cel-mai-mare-si-cel-mai-mic-numar-din-cifre.cpp
/*
 * 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.