0654 - Collatz: Difference between revisions

From Bitnami MediaWiki
Sinn Erich (talk | contribs)
Sinn Erich (talk | contribs)
 
(3 intermediate revisions by the same user not shown)
Line 27: Line 27:
== Exemplul 1 ==
== Exemplul 1 ==
; Datele de intrare
; Datele de intrare
: N este:
: 6
: 6
; Datele de ieșire
: Datele sunt introduse corect.
: Datele sunt introduse corect.
; Datele de ieșire
: 9
: 9
<br>
<br>
Line 48: Line 49:


if __name__ == '__main__':
if __name__ == '__main__':
     n = int(input())
     n = int(input("N este:"))
     if not (1 <= n <= 1000000):
     if not (1 <= n <= 1000000):
         print("Datele nu corespund restricțiilor impuse.")
         print("Datele nu corespund restricțiilor impuse.")

Latest revision as of 07:16, 27 April 2023

Sursa: [1]

Cerinţa[edit | edit source]

Fie număr natural n. Acestuia i se aplică în mod repetat următoarele transformări:

dacă n este par, devine n/2 dacă n este impar, devine 3*n+1

În 1937 matematicianul Lothar Collatz a formulat următoarea conjectură : pentru orice număr natural, în urma transformărilor numărul devine 1.

De exemplu, pentru n=6 se obține șirul: 6 3 10 5 16 8 4 2 1, șir care are 9 termeni.

Pentru un n dat, determinați numărul de termeni din șirul de transformări după regula de mai sus.

Date de intrare[edit | edit source]

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

Date de ieșire[edit | edit source]

Programul va afișa pe ecran numărul C, reprezentând numărul de termeni din șirul transformărilor de mai sus.

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează numărul de termeni din șirul de transformări după regula de mai sus.

În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse."

Restricţii şi precizări[edit | edit source]

1 ≤ n ≤ 1 000 000

Exemplul 1[edit | edit source]

Datele de intrare
N este:
6
Datele de ieșire
Datele sunt introduse corect.
9


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 0654

def collatz_length(n):

   count = 1  # numărul inițial de termeni este 1
   while n != 1:
       if n % 2 == 0:
           n = n // 2
       else:
           n = 3 * n + 1
       count += 1
   return count


if __name__ == '__main__':

   n = int(input("N este:"))
   if not (1 <= n <= 1000000):
       print("Datele nu corespund restricțiilor impuse.")
   else:
       print("Datele sunt introduse corect.")
       print(collatz_length(n))

</syntaxhighlight>

Explicatie cod:

Acest cod calculează lungimea secvenței Collatz pentru un număr dat. Secvența Collatz a unui număr începe cu acel număr și se construiește prin aplicarea repetată a următoarei reguli: dacă numărul este par, îl împărțim la 2, altfel îl înmulțim cu 3 și adăugăm 1. Lungimea secvenței este dată de numărul de termeni ai secvenței.

Funcția collatz_length primește ca argument un număr n și calculează lungimea secvenței Collatz pentru acel număr. Numărul inițial de termeni este 1 și se crește cu 1 la fiecare iterație a while-ului până când numărul ajunge la 1.

Funcția apoi este apelată în blocul if __name__ == '__main__':, care citește de la tastatură un număr n și verifică dacă acesta se află în intervalul [1, 1000000]. Dacă nu, se afișează un mesaj de eroare. Dacă este, se calculează și se afișează lungimea secvenței Collatz pentru acel număr.