3100 - suma perm circ

From Bitnami MediaWiki
Revision as of 11:59, 20 April 2023 by Cata (talk | contribs) (Pagină nouă: ==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 numărul S, reprezentând suma cerută. ==Restricții și precizări== * n are cel mult 100.000 de cifre ==Exemplu== Intrare 165 Ieșire 1332 Numere...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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 numărul S, reprezentând suma cerută.


Restricții și precizări

  • n are cel mult 100.000 de cifre

Exemplu

Intrare

165

Ieșire

1332

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

Rezolvare

<syntaxhighlight lang="python> 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
   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

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)

</syntaxhighlight>

Explicatie

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.