2757 - Cifre Zecimale 1: Difference between revisions

From Bitnami MediaWiki
Paul Ungur (talk | contribs)
Pagină nouă: ==Cerința== Se consideră șirul de cifre zecimale obținut prin scrierea consecutivă a numerelor naturale de la <span style=“color: red”> 100</span> la <span style=“color: red”> 999</span>: <span style=“color: red”> 100101102103104105…995996997998999</span>. Să se afișeze cifra ce apare pe poziția <span style=“color: red”> k</span> în acest șir. ==Date de intrare== Programul citește de la tastatură un număr natural <span style=“color: red”> n...
 
Paul Ungur (talk | contribs)
No edit summary
 
(3 intermediate revisions by the same user not shown)
Line 6: Line 6:


==Date de ieșire==
==Date de ieșire==
Programul va afișa pe ecran, pe un singur rând și separate printr-un spațiu, <span style=“color: red”> n</span> numere reprezentând cifrele din șir de pe pozițiile <span style=“color: red”> k</span>, citite.
Dacă datele sunt introduse corect, pe ecran se va afișa: '''"Date de intrare valide."''', apoi Programul va afișa pe ecran, pe un singur rând și separate printr-un spațiu, <span style=“color: red”> n</span> numere reprezentând cifrele din șir de pe pozițiile <span style=“color: red”> k</span>, citite. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: '''"Date de intrare invalide".'''


==Restricții și precizări==
==Restricții și precizări==
Line 14: Line 14:
==Exemplu:==
==Exemplu:==
Intrare
Intrare
3
: 3
5 10 18
: 5 10 18


Ieșire
Ieșire
0 1 5  
: Date de intrare valide
: 0 1 5  


==Explicație==
==Explicație==
Line 25: Line 26:
==Rezolvare==
==Rezolvare==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
def validate_input(n, k_values):
def validare_date(n, k_values):
     # Verificăm dacă n este în intervalul permis
     # Verificăm dacă n este în intervalul permis
     if n < 1 or n > 100000:
     if n < 1 or n > 100000:
Line 36: Line 37:
     return True
     return True


def read_input():
 
def citeste_input():
     n = int(input())
     n = int(input())
     k_values = list(map(int, input().split()))
     k_values = list(map(int, input().split()))
     return n, k_values
     return n, k_values


def get_digit_at_position(k):
 
def cifre(k):
     # Vom construi șirul de cifre folosind o buclă while
     # Vom construi șirul de cifre folosind o buclă while
     num = 100
     num = 100
Line 57: Line 60:
         num += 1
         num += 1


def main():
 
    n, k_values = read_input()
def obtine_cifrele_pentru_k(n, k_values):
     # Verificăm dacă datele de intrare sunt valide
     # Verificăm dacă datele de intrare sunt valide
     if not validate_input(n, k_values):
     if not validare_date(n, k_values):
         print("Date de intrare invalide")
         return "Date de intrare invalide"
        return
     # Obținem cifra de pe fiecare poziție k și o adăugăm la lista de rezultate
     # Obținem cifra de pe fiecare poziție k și o adăugăm la lista de rezultate
     results = [get_digit_at_position(k) for k in k_values]
     results = [cifre(k) for k in k_values]
     # Afișăm lista de rezultate
     # Afișăm lista de rezultate
     print(*results)
     return results
 


if __name__ == '__main__':
if __name__ == '__main__':
     main()
     n, k_values = citeste_input()
    # Obținem cifrele corespunzătoare pozițiilor k și le afișăm
    if validare_date(n, k_values):
        print("Date de intrare valide")
        results = obtine_cifrele_pentru_k(n, k_values)
        print(*results)
    else:
        print("Date de intrare invalide")
</syntaxhighlight>
</syntaxhighlight>
 
==Explicatie cod:==
==Explicatie==
Funcția validare_date(n, k_values) primește un număr n și o listă de valori k_values și verifică dacă acestea respectă anumite condiții. Verificările includ verificarea ca n să fie în intervalul [1, 100000], iar fiecare valoare k din lista k_values să fie în intervalul [1, 2700]. Dacă datele nu respectă aceste condiții, funcția returnează False. În caz contrar, returnează True.
Funcția validate_input verifică dacă datele de intrare sunt valide, în funcție de restricțiile din cerință. Funcția read_input citește numărul de valori de k și lista respectivelor valori de la tastatură. Funcția get_digit_at_position primește o poziție k și returnează cifra de pe acea poziție în șirul dat. Funcția main apelează celelalte două funcții și obține cifra de pe fiecare poziție k dată, afișând aceste cifre separate prin spații.
Funcția citeste_input() primește input-ul utilizatorului, citind n și lista de valori k_values de la intrare folosind funcția input(). Valoarea n este citită ca un număr întreg, iar lista k_values este citită ca o listă de numere întregi utilizând map() și split(). Funcția returnează n și k_values sub formă de tuplu.
 
Funcția cifre(k) primește un număr k și calculează cifra de pe poziția k. Acest lucru se face construind un șir de cifre folosind o buclă while. La fiecare iterație, se obțin cifrele numărului curent și se adaugă numărul de cifre la digit_count. Dacă digit_count depășește sau ajunge la poziția k, se returnează cifra corespunzătoare. Se adaugă un offset la k pentru a ajusta indexarea în lista de cifre.
Pentru a afișa valorile dintr-o listă separat prin spații, am folosit operatorul * înaintea listei în apelul funcției print. Această sintaxă permite să afișăm elementele din listă separat prin spații, fără a fi necesar să parcurgem manual lista și să afișăm fiecare element.
Funcția obtine_cifrele_pentru_k(n, k_values) primește un număr n și o listă de valori k_values și returnează lista de cifre corespunzătoare pozițiilor k din k_values. Verifică mai întâi dacă datele de intrare sunt valide folosind funcția validare_date(). Apoi, utilizează funcția cifre() pentru a obține cifra corespunzătoare fiecărei valori k din lista k_values. Rezultatele sunt stocate într-o listă și returnate.
În blocul if __name__ == '__main__':, se apelează funcția citeste_input() pentru a obține n și k_values de la intrare. Apoi, se verifică dacă datele de intrare sunt valide utilizând funcția validare_date(). Dacă datele sunt valide, se afișează un mesaj de confirmare, se apelează funcția obtine_cifrele_pentru_k() și se afișează rezultatele. În caz contrar, se afișează un mesaj de eroare.

Latest revision as of 18:57, 29 June 2023

Cerința[edit | edit source]

Se consideră șirul de cifre zecimale obținut prin scrierea consecutivă a numerelor naturale de la 100 la 999: 100101102103104105…995996997998999. Să se afișeze cifra ce apare pe poziția k în acest șir.

Date de intrare[edit | edit source]

Programul citește de la tastatură un număr natural n și apoi n numere naturale nenule, k.

Date de ieșire[edit | edit source]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Date de intrare valide.", apoi Programul va afișa pe ecran, pe un singur rând și separate printr-un spațiu, n numere reprezentând cifrele din șir de pe pozițiile k, citite. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Date de intrare invalide".

Restricții și precizări[edit | edit source]

1 ≤ n ≤ 100.000 1 ≤ k ≤ 2700

Exemplu:[edit | edit source]

Intrare

3
5 10 18

Ieșire

Date de intrare valide
0 1 5

Explicație[edit | edit source]

A cinceaa cifră din șir este 0, cea de pe poziția 10 este 1, iar cea de pe poziția 18 este 5.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def validare_date(n, k_values):

   # Verificăm dacă n este în intervalul permis
   if n < 1 or n > 100000:
       return False
   # Verificăm dacă toate valorile de k sunt în intervalul permis
   for k in k_values:
       if k < 1 or k > 2700:
           return False
   # Dacă am trecut de toate verificările, înseamnă că datele de intrare sunt valide
   return True


def citeste_input():

   n = int(input())
   k_values = list(map(int, input().split()))
   return n, k_values


def cifre(k):

   # Vom construi șirul de cifre folosind o buclă while
   num = 100
   digit_count = 0
   while True:
       # Obținem cifrele numărului curent
       digits = [int(d) for d in str(num)]
       # Adăugăm numărul de cifre din numărul curent la contorul de cifre
       digit_count += len(digits)
       # Dacă numărul de cifre depășește poziția k, ne oprim
       if digit_count >= k:
           # Obținem cifra de pe poziția k
           return digits[k - digit_count + len(digits) - 1]
       # Dacă nu am ajuns încă la poziția k, trecem la următorul număr
       num += 1


def obtine_cifrele_pentru_k(n, k_values):

   # Verificăm dacă datele de intrare sunt valide
   if not validare_date(n, k_values):
       return "Date de intrare invalide"
   # Obținem cifra de pe fiecare poziție k și o adăugăm la lista de rezultate
   results = [cifre(k) for k in k_values]
   # Afișăm lista de rezultate
   return results


if __name__ == '__main__':

   n, k_values = citeste_input()
   # Obținem cifrele corespunzătoare pozițiilor k și le afișăm
   if validare_date(n, k_values):
       print("Date de intrare valide")
       results = obtine_cifrele_pentru_k(n, k_values)
       print(*results)
   else:
       print("Date de intrare invalide")

</syntaxhighlight>

Explicatie cod:[edit | edit source]

Funcția validare_date(n, k_values) primește un număr n și o listă de valori k_values și verifică dacă acestea respectă anumite condiții. Verificările includ verificarea ca n să fie în intervalul [1, 100000], iar fiecare valoare k din lista k_values să fie în intervalul [1, 2700]. Dacă datele nu respectă aceste condiții, funcția returnează False. În caz contrar, returnează True. Funcția citeste_input() primește input-ul utilizatorului, citind n și lista de valori k_values de la intrare folosind funcția input(). Valoarea n este citită ca un număr întreg, iar lista k_values este citită ca o listă de numere întregi utilizând map() și split(). Funcția returnează n și k_values sub formă de tuplu. Funcția cifre(k) primește un număr k și calculează cifra de pe poziția k. Acest lucru se face construind un șir de cifre folosind o buclă while. La fiecare iterație, se obțin cifrele numărului curent și se adaugă numărul de cifre la digit_count. Dacă digit_count depășește sau ajunge la poziția k, se returnează cifra corespunzătoare. Se adaugă un offset la k pentru a ajusta indexarea în lista de cifre. Funcția obtine_cifrele_pentru_k(n, k_values) primește un număr n și o listă de valori k_values și returnează lista de cifre corespunzătoare pozițiilor k din k_values. Verifică mai întâi dacă datele de intrare sunt valide folosind funcția validare_date(). Apoi, utilizează funcția cifre() pentru a obține cifra corespunzătoare fiecărei valori k din lista k_values. Rezultatele sunt stocate într-o listă și returnate. În blocul if __name__ == '__main__':, se apelează funcția citeste_input() pentru a obține n și k_values de la intrare. Apoi, se verifică dacă datele de intrare sunt valide utilizând funcția validare_date(). Dacă datele sunt valide, se afișează un mesaj de confirmare, se apelează funcția obtine_cifrele_pentru_k() și se afișează rezultatele. În caz contrar, se afișează un mesaj de eroare.