0951 - Cifre7: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Se generează un şir de cifre ai cărui primi termeni sunt, în această ordine: '''1, 1, 2, 4, 7, 3, 4, 4, 1, 9, 4, 4, 7, 5, 6, 8,...''' ==Cerință== Deduceţi regula după care sunt generaţi termenii şirului şi scrieţi un program care să citească numerele naturale n, k şi p şi care să determine: a) numărul de apariţii ale cifrei k printre primii n termeni ai şirului din enunţ; b) cel de-al p-lea termen al şirului din enunţ. ==Date de intrare== Programul...
 
No edit summary
Line 24: Line 24:
*Pentru rezolvarea corectă a cerinţei a) se acordă '''30%''' din punctaj iar pentru cerinţa b) 70% din punctaj.
*Pentru rezolvarea corectă a cerinţei a) se acordă '''30%''' din punctaj iar pentru cerinţa b) 70% din punctaj.


==Exemplu==
==Exemplul 1==


;Intrare
;Intrare
:19 4 26
:19 4 26


;Ieșire
;Ieșire
:Datele de intrare corespund restrictiilor impuse.
:5
:5
:7
:7
==Exemplul 2==
;Intrare
:200 200 200
;Ieșire
:Datele de intrare nu corespund restrictiilor impuse.




Line 37: Line 50:


<syntaxhighlight lang="python" line="1" start="1">
<syntaxhighlight lang="python" line="1" start="1">
def sir_numere(n, k, p):
 
def verificare_restrictii(nr_n, nr_k, nr_p):    # functia de verificare a datelor de intrare
    if 17 <= nr_n <= 100 and 0 <= nr_k <= 9 and 1 <= nr_p <= 2000000000:
        return True
    else:
        return False
 
 
def sir_numere(nr_n, nr_k, nr_p):
     sir = [1, 1, 2, 4, 7, 3, 4, 4, 1, 9]
     sir = [1, 1, 2, 4, 7, 3, 4, 4, 1, 9]
     while len(sir) < max(n, p):
     while len(sir) < max(nr_n, nr_p):
         ultim_cifra = sir[-1] % 10
         ultim_cifra = sir[-1] % 10
         penultim_cifra = sir[-2] % 10
         penultim_cifra = sir[-2] % 10
Line 45: Line 66:
         nou_cifra = (ultim_cifra + penultim_cifra + antepenultim_cifra) % 10
         nou_cifra = (ultim_cifra + penultim_cifra + antepenultim_cifra) % 10
         sir.append(nou_cifra)
         sir.append(nou_cifra)
     aparitii_k = sir[:n].count(k)
     nr_aparitii_k = sir[:n].count(nr_k)
     p_lea_termen = sir[p-1]
     al_p_lea_termen = sir[p-1]
     return aparitii_k, p_lea_termen
     return nr_aparitii_k, al_p_lea_termen
 


if __name__ == "__main__":
if __name__ == "__main__":
     n = 19
     try:
    k = 4
        n = int(input("Introduceti numarul n: "))
    p = 26
        k = int(input("Introduceti numarul k: "))
    aparitii_k, p_lea_termen = sir_numere(n, k, p)
        p = int(input("Introduceti numarul p: "))
    print(aparitii_k)
    print(p_lea_termen)


        if verificare_restrictii(n, k, p):            # verificam datele de intrare
            print("Datele de intrare corespund restrictiilor impuse.")
            aparitii_k, p_lea_termen = sir_numere(n, k, p)
            print(aparitii_k)
            print(p_lea_termen)
        else:
            print("Datele de intrare nu corespund restrictiilor impuse.")
    # ne asteptam la 2 tipuri de erori din cauza datelor de intrare, le tratam corespunzator
    except ValueError:
        print("Datele de intrare nu corespund restrictiilor impuse.")
    except IndexError:
        print("Datele de intrare nu corespund restrictiilor impuse.")


</syntaxhighlight>
</syntaxhighlight>

Revision as of 14:26, 12 November 2023

Se generează un şir de cifre ai cărui primi termeni sunt, în această ordine: 1, 1, 2, 4, 7, 3, 4, 4, 1, 9, 4, 4, 7, 5, 6, 8,...

Cerință

Deduceţi regula după care sunt generaţi termenii şirului şi scrieţi un program care să citească numerele naturale n, k şi p şi care să determine:

a) numărul de apariţii ale cifrei k printre primii n termeni ai şirului din enunţ; b) cel de-al p-lea termen al şirului din enunţ.

Date de intrare

Programul citește de la tastatură numerele n k p.

Date de ieșire

Programul va afișa pe ecran două numere naturale:

  • primul număr va reprezenta numărul de apariţii ale cifrei k printre primii n termeni ai şirului din enunţ;
  • al doilea număr va reprezenta cel de-al p-lea termen al şirului din enunţ.

Restricții de precizări

  • Numerele n k p sunt naturale
  • 17 ≤ n ≤100; 0 ≤ k ≤ 9; 1≤ p ≤ 2000000000
  • Pentru rezolvarea corectă a cerinţei a) se acordă 30% din punctaj iar pentru cerinţa b) 70% din punctaj.

Exemplul 1

Intrare
19 4 26
Ieșire
Datele de intrare corespund restrictiilor impuse.
5
7

Exemplul 2

Intrare
200 200 200
Ieșire
Datele de intrare nu corespund restrictiilor impuse.


Rezolvare

<syntaxhighlight lang="python" line="1" start="1">

def verificare_restrictii(nr_n, nr_k, nr_p): # functia de verificare a datelor de intrare

   if 17 <= nr_n <= 100 and 0 <= nr_k <= 9 and 1 <= nr_p <= 2000000000:
       return True
   else:
       return False


def sir_numere(nr_n, nr_k, nr_p):

   sir = [1, 1, 2, 4, 7, 3, 4, 4, 1, 9]
   while len(sir) < max(nr_n, nr_p):
       ultim_cifra = sir[-1] % 10
       penultim_cifra = sir[-2] % 10
       antepenultim_cifra = sir[-3] % 10
       nou_cifra = (ultim_cifra + penultim_cifra + antepenultim_cifra) % 10
       sir.append(nou_cifra)
   nr_aparitii_k = sir[:n].count(nr_k)
   al_p_lea_termen = sir[p-1]
   return nr_aparitii_k, al_p_lea_termen


if __name__ == "__main__":

   try:
       n = int(input("Introduceti numarul n: "))
       k = int(input("Introduceti numarul k: "))
       p = int(input("Introduceti numarul p: "))
       if verificare_restrictii(n, k, p):             # verificam datele de intrare
           print("Datele de intrare corespund restrictiilor impuse.")
           aparitii_k, p_lea_termen = sir_numere(n, k, p)
           print(aparitii_k)
           print(p_lea_termen)
       else:
           print("Datele de intrare nu corespund restrictiilor impuse.")
   # ne asteptam la 2 tipuri de erori din cauza datelor de intrare, le tratam corespunzator
   except ValueError:
       print("Datele de intrare nu corespund restrictiilor impuse.")
   except IndexError:
       print("Datele de intrare nu corespund restrictiilor impuse.")

</syntaxhighlight>

Explicație

Primii 19 termeni ai şirului sunt: 1,1,2,4,7,3,4,4,1,9,4,4,7,5,6, 8,9,3,0.

Primul număr afişat este 5, deoarece sunt 5 cifre din șir egale cu k (k=4) printre primii n=19 termeni ai şirului.

Al doilea număr afişat este 7, deoarece cel de-al p-lea (p=26) termen al şirului este 7.