3100 - suma perm circ

De la Universitas MediaWiki

Cerința

Scrieți un program care citește un număr natural n și care să calculeze și să afișeze suma S a tuturor numerelor obținute prin permutări circulare ale cifrelor lui n cu o poziție.


Date de intrare

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


Date de ieșire

Programul va afișa pe ecran mesajul de validare și numărul S, reprezentând suma cerută. În cazul în care datele nu sunt valide, se va afișa un mesaj corespunzător.

Restricții și precizări

  • n are cel mult 100.000 de cifre

Exemplu

Intrare
165

Ieșire

Date de intrare valide
1332

Numere obținute din 165 prin permutări circulare sunt 165, 651 și 516, iar suma lor este 1332.

Rezolvare

def validate_input(s):
    if len(s) > 100000:
        print("Error: n has more than 100000 digits")
        return False
    for c in s:
        if not c.isdigit():
            print("Error: n must contain only digits")
            return False
    return True

def citire(A):
    s = input()
    if not validate_input(s):
        return
    else:
        print("Date de intrare valide")
    l = len(s)
    for i in range(l-1, -1, -1):
        A[l-i] = int(s[i])
    A[0] = l

def afisare(A):
    for i in range(A[0], 0, -1):
        print(A[i], end='')

def prod(B, x):
    t = 0
    for i in range(1, B[0]+1):
        t = B[i] * x + t
        B[i] = t % 10
        t //= 10
    while t:
        B[0] += 1
        B[B[0]] = t % 10
        t //= 10

if __name__ == "__main__":
    N = [0] * 100001
    S = [0] * 100001
    citire(N)
    S[0] = N[0]
    for i in range(1, N[0]+1):
        S[i] = 1
    sumcf = sum(N[1:N[0]+1])
    prod(S, sumcf)
    afisare(S)

Explicație

Acest program citeste un numar mare n (de pana la 100000 de cifre) si calculeaza produsul tuturor cifrelor lui n, apoi afiseaza rezultatul. Pentru a stoca numerele mari, programul utilizeaza un tip de date personalizat nrMare, definit prin intermediul unui alias pentru un vector de tip long. Programul contine si o functie de validare a input-ului, care verifica daca numarul n respecta restricțiile impuse, adica sa aiba cel mult 100000 de cifre si sa contina doar cifre.