2757 - Cifre Zecimale 1

From Bitnami MediaWiki
Revision as of 09:00, 22 April 2023 by 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...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința

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

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

Date de ieșire

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.

Restricții și precizări

1 ≤ n ≤ 100.000 1 ≤ k ≤ 2700

Exemplu:

Intrare 3 5 10 18

Ieșire 0 1 5

Explicație

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

<syntaxhighlight lang="python" line> def validate_input(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 read_input():

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

def get_digit_at_position(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 main():

   n, k_values = read_input()
   # Verificăm dacă datele de intrare sunt valide
   if not validate_input(n, k_values):
       print("Date de intrare invalide")
       return
   # 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]
   # Afișăm lista de rezultate
   print(*results)

if __name__ == '__main__':

   main()

</syntaxhighlight>

Explicatie

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.

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.