0515 - Sort SD

De la Universitas MediaWiki

Cerința

Se dau n numere naturale. Afișați aceste numere ordonate crescător după suma divizorilor. Dacă două numere au aceeași sumă a divizorilor, se va afișa mai întâi cel mai mic.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n numere naturale.

Date de ieșire

Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse."

Pe următoarea linie se vor afișa cele n numere în ordinea cerută.

În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse."

Restricții și precizări

  • 1 ≤ n ≤ 1000
  • cele n numere citite vor fi mai mici decât 100.000.000

Exemplu 1

Intrare
10
24 46 11 36 48 35 27 28 49 6
Ieșire
Datele de intrare corespund restricțiilor impuse.
6 11 27 35 28 49 24 46 36 48

Exemplu 2

Intrare
-2
Ieșire
Datele de intrare nu corespund restricțiilor impuse.

Rezolvare

#0515 - SortSD
def conditii(n, numere):
    return len(numere) == n and \
        1 <= n <= 1_000 and \
        all(nr < 100_000_000 for nr in numere)


def sort_sd(numere):
    rezultat = sorted(numere, key=lambda x: (sum([i for i in range(1, x + 1) if x % i == 0]), x))
    # cheia de sortare returneaza un tuplu de 2 elemente:
    # 1) suma divizorilor unui număr, SD(x) -> sum([i for i in range(1, x + 1) if x % i == 0]
    # 2) numărul în sine, x
    # Numerele sunt sortate după SD(x). Dacă două numere au aceeași SD, atunci sunt sortate după valoarea lor.
    print(" ".join([str(x) for x in rezultat]))


if __name__ == "__main__":
    n = int(input())
    numere = [int(x) for x in input().split()]
    if not conditii(n, numere):
        print("Datele de intrare nu corespund restricțiilor impuse.")
    else:
        print("Datele de intrare corespund restricțiilor impuse.")
        sort_sd(numere)