2275 - Minim Doua

De la Universitas MediaWiki

Sursă: [1]

Cerinţa

Se dau n numere naturale. Determinați cele mai mici două numere dintre cele introduse care au ultimele două cifre egale. Dacă nu există cel puțin două astfel de numere se va afișa numere insuficiente.

Date de intrare

Fișierul de intrare minimdoua.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale separate prin spații.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte." Fișierul de ieșire minimdoua.out va conține pe prima linie numerele minim1 si minim2, reprezentând minimele cerute, în ordine crescătoare, dacă fișierul de intrare conține cel puțin două astfel de numere, respectiv numere insuficiente, în caz contrar. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricții și precizări

  • 1 ≤ n ≤ 200
  • pentru fiecare număr x de pe a doua linie a fișierului de intrare este îndeplinită relația 0 ≤ x ≤ 1.000.000
  • minimele cerute vor avea cel puțin două cifre

Exemple

Exemplu 1

minimdoua.in
7
12 55 112 322 477 115 7
minimdoua.out
55 322

Exemplu 2

minimdoua.in
6
12 55 112 3 4774 115
minimdoua.out
numere insuficiente

Explicație

În fișierul de intrare este doar un singur număr cu proprietatea cerută.

Rezolvare

def citeste_n():
    while True:
        try:
            with open("minimdoua.in", "r") as fin:
                n = int(fin.readline())
                if n >= 2 and n <= 1000:
                    print("Datele sunt corecte.")
                    return n
                else:
                    print("Datele nu sunt conform restricțiilor impuse.")
                    exit()
        except ValueError:
            print("Trebuie introduse doar numere intregi.")
            exit()


def citeste_valori(n):
    valori = []
    for i in range(n):
        with open("minimdoua.in", "r") as fin:
            fin.readline()
            linie = fin.readline().strip().split()
            while len(linie) != n:
                linie += fin.readline().strip().split()
            try:
                if len(linie[i]) <= 9:
                    print("Datele sunt corecte.")
                    valori.append(int(linie[i]))
                else:
                    print("Trebuie introduse doar valori cu mai putin de 9 cifre.")
                    exit()
            except ValueError:
                print("Trebuie introduse doar valori cu mai putin de 9 cifre.")
                exit()
    return valori


def minim_doua(valori):
    a = []
    v = []
    for i in range(len(valori)):
        if valori[i] % 10 == (valori[i] // 10) % 10 and valori[i] > 9:
            v.append(valori[i])
    v.sort()
    if len(v) >= 2:
        return v[0], v[1]
    else:
        return "numere insuficiente"


if _name_ == '_main_':
    n = citeste_n()
    valori = citeste_valori(n)
    minim1, minim2 = minim_doua(valori)
    with open("minimdoua.out", 'w') as f:
        if isinstance(minim1, str):
            f.write(minim1)
        else:
            f.write(str(minim1) + ' ' + str(minim2))

Explicații

Acesta este un cod Python care rezolvă o problemă de găsire a celor mai mici două numere întregi pozitive cu aceeași cifră zecimală de unitate.
Funcția citeste_n() deschide fișierul "minimdoua.in" și încearcă să citească un singur număr întreg de pe prima linie. Dacă numărul îndeplinește condițiile de a fi între 2 și 1000, atunci funcția va returna acest număr. În caz contrar, se va afișa un mesaj de eroare și se va ieși din program.
Funcția citeste_valori(n) primește ca argument numărul de valori pe care trebuie să le citească. Apoi, pentru fiecare linie din fișier, funcția va citi o linie, va elimina caracterele de tip newline și apoi va împărți acea linie în cuvinte. Dacă numărul de cuvinte împărțite nu este egal cu n, atunci vor fi citite noi linii până când numărul de cuvinte va fi egal cu n. În continuare, funcția va verifica fiecare cuvânt și dacă lungimea sa este mai mică sau egală cu 9, va adăuga numărul într-o listă. Altfel, se va afișa un mesaj de eroare și se va ieși din program. Funcția va returna lista de numere citite.
Funcția minim_doua(valori) primește lista de numere și va adăuga numerele care îndeplinesc condiția specificată într-o altă listă, v. Această listă va fi sortată în ordine crescătoare, iar dacă are cel puțin două elemente, atunci primele două elemente vor fi cele două numere cu cifra zecimală de unitate identică și mai mici. Altfel, funcția va returna un mesaj care indică faptul că lista de numere nu are suficiente elemente.
În funcția principală _main_, se vor apela funcțiile citeste_n(), citeste_valori(n) și minim_doua(valori) pentru a obține cele mai mici două numere întregi pozitive cu aceeași cifră zecimală de unitate. Apoi, rezultatele vor fi scrise în fișierul "minimdoua.out" în funcție de rezultatul returnat de minim_doua(valori). Dacă funcția returnează un mesaj de eroare, atunci mesajul va fi scris în fișier.