2001 - Huge Control

De la Universitas MediaWiki

Cerința

Cifra de control a unui număr se obţine efectuând suma cifrelor sale, apoi suma cifrelor acestei sume etc. până se obţine o sumă formată dintr-o singură cifră. De exemplu, cifra de control a numărului 713 este 2. (7 + 1 + 3 = 11, 1 + 1 = 2).

Un număr de tip Huge este un număr natural de maxim 1.000.000 de cifre.

În fișierul hugecontrol.in se găsește memorat un număr N, de tip Huge. Calculati și afișati cifra de control a numărului.

Date de intrare

Programul citește din fișierul de intrare hugecontrol.in numărul N, de tip Huge.

Date de ieșire

Programul va afișa în fișierul de ieșire hugecontrol.out numărul digit, reprezentând cifra de control a lui N, alături de un mesaj de validare a datelor introduse ("Input valid" sau "Input invalid" după caz).

Restricții și precizări

N este un număr cu proprietăți caracteristice tipului Huge.

Exemplu

Intrare
713
Ieșire
Input valid
2

Explicație

7 + 1 + 3 = 11, 1 + 1 = 2

Rezolvare

def is_valid_number(n):
    return n.isdigit() and len(n) <= 1000000


def compute_control_digit(n):
    nr = 0

    for c in n:
        nr = nr * 10 + int(c)
        nr %= 9

    return 9 if nr == 0 else nr


if __name__ == "__main__":
    with open("hugecontrol.in", "r") as fin, open("hugecontrol.out", "w") as fout:
        n = fin.readline().strip()

        if not is_valid_number(n):
            print("Input invalid")
            return
        else:
            print("Input valid")

        control_digit = compute_control_digit(n)
        fout.write(str(control_digit))

Explicație cod

Aceste funcții aparțin unui program care primește un număr mare și verifică dacă este valid, apoi calculează și scrie într-un fișier cifra de control a numărului dat.

`is_valid_number(n)` este o funcție care primește un șir de caractere `n` și returnează `True` dacă șirul este format din cifre și are lungimea mai mică sau egală cu un milion, altfel returnează `False`. Această funcție este utilizată pentru a verifica dacă numărul de intrare este valid.

`compute_control_digit(n)` este o funcție care primește un șir de caractere `n` și calculează cifra de control a numărului dat. Algoritmul pentru a calcula cifra de control este următorul:

  1. Se pornește cu valoarea 0 pentru variabila `nr`.
  2. Se parcurge fiecare caracter din șirul de intrare `n`.
  3. Pentru fiecare caracter, se multiplică `nr` cu 10 și se adaugă valoarea numerică a caracterului.
  4. Se face modulo 9 pentru a reduce `nr` la un număr între 0 și 8.
  5. Când toți caracterele sunt procesate, se returnează 9 dacă `nr` este egal cu 0, altfel se returnează valoarea din `nr`.

În codul principal, `__name__ == "__main__"` asigură faptul că blocul de cod din interiorul lui este executat numai atunci când fișierul este rulat ca un script și nu ca modul importat.

În interiorul blocului principal, fișierul "hugecontrol.in" este deschis și citit, iar primul rând este citit ca șirul de intrare `n`. Apoi, se verifică dacă numărul este valid folosind `is_valid_number(n)`. Dacă numărul nu este valid, se afișează mesajul "Input invalid" și programul se termină. Altfel, se afișează mesajul "Input valid" și se calculează cifra de control folosind `compute_control_digit(n)`. Această cifră de control este scrisă în fișierul "hugecontrol.out" folosind `fout.write(str(control_digit))`.