2202 - Extindere: Difference between revisions
Sinn Erich (talk | contribs) |
Sinn Erich (talk | contribs) |
||
(8 intermediate revisions by the same user not shown) | |||
Line 11: | Line 11: | ||
== Date de ieșire == | == Date de ieșire == | ||
Programul va | Programul va conține pe prima linie numărul '''c''' care reprezintă a '''n'''-a cifră a șirului format după regula precizată mai sus. | ||
Dacă datele sunt introduse corect, | Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", apoi pe un rând nou afișează a n-a cifră a șirului s, astfel încât numărul de pași ai programului să fie proporțional cu log2(n) (complexitate timp logaritmică în funcție de n). | ||
În | În caz contrar, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse." | ||
== Restricţii şi precizări == | == Restricţii şi precizări == | ||
* | * 1 ≤ '''n''' ≤ 1.000.000 | ||
== Exemplul 1 == | == Exemplul 1 == | ||
; | ; Datele de intrare | ||
: | : Introdu un nr. : | ||
; | : 18 | ||
: Datele | ; Datele de ieșire | ||
: | : Datele sunt introduse corect. | ||
: 1 | |||
<br> | <br> | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python" line> | <syntaxhighlight lang="python" line> | ||
# | #2202 | ||
import math | |||
def build_sequence(n): | |||
k = 1 | |||
s = '1221' | |||
while 2**k < n: | |||
s_new = '' | |||
for i in range(len(s)): | |||
if s[i] == '1': | |||
s_new += '12' | |||
else: | |||
s_new += '21' | |||
s = s_new | |||
k += 1 | |||
return s | |||
def | def find_digit(n, s): | ||
pos = 0 | |||
for | for i in range(len(s)): | ||
if pos == n-1: | |||
return s[i] | |||
pos += 1 | |||
if pos >= len(s): | |||
pos = 0 | |||
s *= k | |||
def validate_input(n): | |||
def | if n <= 0 or not isinstance(n, int): | ||
if n < | |||
return False | return False | ||
return True | else: | ||
return True | |||
if __name__ == '__main__': | if __name__ == '__main__': | ||
n = int(input(" | n = int(input("Introdu un nr. :")) | ||
if | if validate_input(n): | ||
print("Datele introduse | print("Datele sunt introduse corect.") | ||
s = build_sequence(n) | |||
print(find_digit(n, s)) | |||
else: | else: | ||
print("Datele nu corespund restricțiilor impuse.") | |||
print("Datele | |||
</syntaxhighlight> | |||
'''Explicatie cod:''' | |||
Acest cod definește două funcții: build_sequence(n) și find_digit(n, s). Funcția build_sequence(n) primește un număr natural n și construiește secvența de cifre specificată în enunț folosind regula dată. Aceasta crește lungimea șirului cu fiecare iterație, până când șirul are cel puțin n cifre. Funcția find_digit(n, s) primește numărul n și șirul de cifre s și găsește și returnează cifra de pe poziția n din șirul s. | |||
La final, se verifică dacă programul rulează ca modul principal cu ajutorul declarației if __name__ == '__main__':. Dacă acesta este cazul, programul va citi un număr n de la utilizator, va construi șirul specificat și va găsi și afișa cifra de pe poziția n din șir folosind cele două funcții definite anterior. |
Latest revision as of 07:06, 27 April 2023
Sursa: [1]
Cerinţa[edit | edit source]
Se consideră operația ': {1; 2} → {1; 2}, astfel încât 1 = 2, 2 = 1. Operația se extinde asupra oricărei secvențe formate cu cifre de 1 și 2, de exemplu 1211212121 =2122121212. 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 = sk sk sk sk, …, pentru orice număr natural nenul k.
Să se scrie un program care pentru un n număr natural nenul cunoscut determină și afișează a n-a cifră a șirului s, astfel încât numărul de pași ai programului să fie proporțional cu log2(n) (complexitate timp logaritmică în funcție de n).
Date de intrare[edit | edit source]
Programul conține pe prima linie numărul natural nenul n.
Date de ieșire[edit | edit source]
Programul va conține pe prima linie numărul c care reprezintă a n-a cifră a șirului format după regula precizată 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ă a n-a cifră a șirului s, astfel încât numărul de pași ai programului să fie proporțional cu log2(n) (complexitate timp logaritmică în funcție de n).
Î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
- Introdu un nr. :
- 18
- Datele de ieșire
- Datele sunt introduse corect.
- 1
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 2202
import math
def build_sequence(n):
k = 1 s = '1221' while 2**k < n: s_new = for i in range(len(s)): if s[i] == '1': s_new += '12' else: s_new += '21' s = s_new k += 1 return s
def find_digit(n, s):
pos = 0 for i in range(len(s)): if pos == n-1: return s[i] pos += 1 if pos >= len(s): pos = 0 s *= k
def validate_input(n):
if n <= 0 or not isinstance(n, int): return False else: return True
if __name__ == '__main__':
n = int(input("Introdu un nr. :")) if validate_input(n): print("Datele sunt introduse corect.") s = build_sequence(n) print(find_digit(n, s)) else: print("Datele nu corespund restricțiilor impuse.")
</syntaxhighlight>
Explicatie cod:
Acest cod definește două funcții: build_sequence(n) și find_digit(n, s). Funcția build_sequence(n) primește un număr natural n și construiește secvența de cifre specificată în enunț folosind regula dată. Aceasta crește lungimea șirului cu fiecare iterație, până când șirul are cel puțin n cifre. Funcția find_digit(n, s) primește numărul n și șirul de cifre s și găsește și returnează cifra de pe poziția n din șirul s.
La final, se verifică dacă programul rulează ca modul principal cu ajutorul declarației if __name__ == '__main__':. Dacă acesta este cazul, programul va citi un număr n de la utilizator, va construi șirul specificat și va găsi și afișa cifra de pe poziția n din șir folosind cele două funcții definite anterior.