2716 - UnuDoi

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

Cerința

Se dă operația x:{1,2}→{1,2} astfel încât 1=2 și 2=1. Operația se poate extinde asupra oricărei secvențe formate cu cifre de 1 și 2, de exemplu 121121212=212212121.

Se consideră șirul infinit s format cu cifre de 1 și 2, generat incremental prin extindere, după următoarea regulă de concatenare:

  • s1=1221
  • s2=1221211221121221
  • sk+1=sksksksk, pentru orice număr natural k.

Dându-se un număr natural n, să se determine a n-a cifră a șirului infinit s.

Date de intrare

Programul citește de la tastatură numărul n.


Date de ieșire

Programul va afișa pe ecran un mesaj de validare a datelor ("Date de intrare valide" pentru date valide; "Valoarea lui n trebuie sa fie intre 1 si 10^8" dacă n depășește valorile cerute) și a n-a cifră a șirului s.


Restricții și precizări

  • 1 ⩽ n ⩽ 108

Exemplu

Intrare
Introduceti valoarea lui n: 11
Ieșire
Date de intrare valide
1
Intrare
Introduceti valoarea lui n: 20
Ieșire
Date de intrare valide
2

Rezolvare

def validate_input(n):
    if 1 <= n <= 10**8:
        return True
    else:
        return False

def calculate_k(n):
    k = 1
    while n >= 4:
        if n % 4 == 2 or n % 4 == 3:
            k = 3 - k
        if n % 4 != 0:
            n = n // 4 + 1
        else:
            n = n // 4
    if n % 4 == 2 or n % 4 == 3:
        k = 3 - k
    return k


if __name__ == "__main__":
    n = int(input("Introduceti valoarea lui n: "))
    if validate_input(n):
        print("Date de intrare valide")
        k = calculate_k(n)
        print(k)
    else:
        print("Valoarea lui n trebuie sa fie intre 1 si 10^8")

Explicatie

Acest cod Python definește două funcții și le folosește pentru a calcula o valoare k în funcție de valoarea introdusă de utilizator pentru n.

Funcția validate_input primește un argument n și returnează True dacă n se află în intervalul [1, 10^8], altfel returnează False.

Funcția calculate_k primește un argument n și calculează o valoare k folosind o serie de condiții. În esență, funcția împarte repetat valoarea n la 4 și schimbă valoarea lui k în funcție de restul împărțirii lui n la 4. Aceasta se repetă până când n devine mai mic decât 4.

În funcția principală, utilizatorul este întâmpinat cu un prompt și îi este cerut să introducă o valoare pentru n. Dacă valoarea este validă, funcția calculate_k este apelată cu n ca argument și valoarea rezultată pentru k este afișată. Dacă valoarea n este invalidă, se afișează un mesaj de eroare.