3100 - suma perm circ: Difference between revisions

From Bitnami MediaWiki
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...
 
Cata (talk | contribs)
No edit summary
Line 8: Line 8:


==Date de ieșire==
==Date de ieșire==
Programul va afișa pe ecran numărul S, reprezentând suma cerută.
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==
==Restricții și precizări==
Line 15: Line 15:


==Exemplu==
==Exemplu==
Intrare
; Intrare
 
: 165
165
Ieșire
Ieșire
 
: Date de intrare valide
1332
: 1332
Numere obținute din 165 prin permutări circulare sunt 165, 651 și 516, iar suma lor este 1332.
Numere obținute din 165 prin permutări circulare sunt 165, 651 și 516, iar suma lor este 1332.


Line 39: Line 38:
     if not validate_input(s):
     if not validate_input(s):
         return
         return
    else:
        print("Date de intrare valide")
     l = len(s)
     l = len(s)
     for i in range(l-1, -1, -1):
     for i in range(l-1, -1, -1):
Line 59: Line 60:
         t //= 10
         t //= 10


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


</syntaxhighlight>
</syntaxhighlight>


==Explicatie==
==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.
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.

Revision as of 06:55, 28 April 2023

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

<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
   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)

</syntaxhighlight>

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.