<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3720_-_Aproape</id>
	<title>3720 - Aproape - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3720_-_Aproape"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3720_-_Aproape&amp;action=history"/>
	<updated>2026-05-01T09:55:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3720_-_Aproape&amp;diff=4769&amp;oldid=prev</id>
		<title>Tamas Claudia: Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/3720/aproape] ---- == Cerinţa == Cunoscând numărul &#039;&#039;&#039;N&#039;&#039;&#039;, să se scrie un program care determină: 1. Numărul de cifre ale acestui număr. 2. Numărul de numere aproape de &#039;&#039;&#039;N&#039;&#039;&#039;. 3. Numărul de numere aproape de cel puțin un număr aproape de &#039;&#039;&#039;N&#039;&#039;&#039;. == Date de intrare == Fișierul de intrare &#039;&#039;&#039;aproape.in&#039;&#039;&#039; conține pe prima linie un număr &#039;&#039;&#039;V&#039;&#039;&#039; a cărui valoare poate fi doar &#039;&#039;&#039;1&#039;&#039;&#039;, &#039;&#039;&#039;2&#039;&#039;&#039; sau &#039;&#039;&#039;3&#039;&#039;&#039;, iar pe a doua lin...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3720_-_Aproape&amp;diff=4769&amp;oldid=prev"/>
		<updated>2023-04-26T17:33:57Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/3720/aproape] ---- == Cerinţa == Cunoscând numărul &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;, să se scrie un program care determină: 1. Numărul de cifre ale acestui număr. 2. Numărul de numere aproape de &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;. 3. Numărul de numere aproape de cel puțin un număr aproape de &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;. == Date de intrare == Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;aproape.in&amp;#039;&amp;#039;&amp;#039; conține pe prima linie un număr &amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039; a cărui valoare poate fi doar &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039;, iar pe a doua lin...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Sursa: [https://www.pbinfo.ro/probleme/3720/aproape]&lt;br /&gt;
----&lt;br /&gt;
== Cerinţa ==&lt;br /&gt;
Cunoscând numărul &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;, să se scrie un program care determină:&lt;br /&gt;
1. Numărul de cifre ale acestui număr.&lt;br /&gt;
2. Numărul de numere aproape de &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
3. Numărul de numere aproape de cel puțin un număr aproape de &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
== Date de intrare ==&lt;br /&gt;
Fișierul de intrare &amp;#039;&amp;#039;&amp;#039;aproape.in&amp;#039;&amp;#039;&amp;#039; conține pe prima linie un număr &amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039; a cărui valoare poate fi doar &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039; sau &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039;, iar pe a doua linie numărul natural &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
== Date de ieșire == &lt;br /&gt;
Dacă datele sunt introduse corect, pe ecran se va afișa: &amp;#039;&amp;#039;&amp;#039;&amp;quot;Datele sunt introduse corect.&amp;quot;&amp;#039;&amp;#039;&amp;#039;, apoi: *  Dacă valoarea lui &amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039; este &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039;, atunci fișierul &amp;#039;&amp;#039;&amp;#039;aproape.out&amp;#039;&amp;#039;&amp;#039; va conține pe prima linie un singur număr ce reprezintă numărul de cifre ale lui &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* Dacă valoarea lui &amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039; este &amp;#039;&amp;#039;&amp;#039;2&amp;#039;&amp;#039;&amp;#039;, atunci fișierul &amp;#039;&amp;#039;&amp;#039;aproape.out&amp;#039;&amp;#039;&amp;#039; va conține pe prima linie un singur număr natural ce reprezintă numărul de numere aproape de &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
* Dacă valoarea lui &amp;#039;&amp;#039;&amp;#039;V&amp;#039;&amp;#039;&amp;#039; este &amp;#039;&amp;#039;&amp;#039;3&amp;#039;&amp;#039;&amp;#039;, atunci fișierul &amp;#039;&amp;#039;&amp;#039;aproape.out&amp;#039;&amp;#039;&amp;#039; va conține pe prima linie un singur număr natural ce reprezintă numărul de numere aproape de un număr aproape de &amp;#039;&amp;#039;&amp;#039;N&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
În caz contrar, pe ecran se va afișa: &amp;#039;&amp;#039;&amp;#039;&amp;quot;Datele nu au fost introduse corect.&amp;quot;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Restricţii şi precizări ==&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;0 ≤ N &amp;lt; 1.000.000.000&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Pentru teste în valoare de 20 de puncte avem &amp;#039;&amp;#039;&amp;#039;V = 1&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru teste în valoare de 30 de puncte avem &amp;#039;&amp;#039;&amp;#039;V = 2&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Pentru teste în valoare de 50 de puncte avem &amp;#039;&amp;#039;&amp;#039;V = 3&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
* Aveți grijă să nu numărați vreun număr de mai multe ori!&lt;br /&gt;
&lt;br /&gt;
== Exemple ==&lt;br /&gt;
===Exemplul 1===&lt;br /&gt;
; aproape.in&lt;br /&gt;
: 1&lt;br /&gt;
: 1903&lt;br /&gt;
; Ecran&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; aproape.out&lt;br /&gt;
: 4&lt;br /&gt;
&lt;br /&gt;
===Exemplul 2===&lt;br /&gt;
; aproape.in&lt;br /&gt;
: 2&lt;br /&gt;
: 1903&lt;br /&gt;
; Ecran&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; concurs.out&lt;br /&gt;
: 5&lt;br /&gt;
===Exemplul 3===&lt;br /&gt;
; aproape.in&lt;br /&gt;
: 3&lt;br /&gt;
: 1903&lt;br /&gt;
; Ecran&lt;br /&gt;
: Datele sunt introduse corect.&lt;br /&gt;
; aproape.out&lt;br /&gt;
: 15&lt;br /&gt;
&lt;br /&gt;
== Rezolvare == &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot; line&amp;gt;&lt;br /&gt;
# 3720&lt;br /&gt;
&lt;br /&gt;
def verifica_restricții(v, n):&lt;br /&gt;
    if v not in (1, 2, 3):&lt;br /&gt;
        return False&lt;br /&gt;
    if not 0 &amp;lt;= n &amp;lt; 1000000000:&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numar_cifre(n):&lt;br /&gt;
    return len(str(n))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def este_aproape(n, m):&lt;br /&gt;
    if numar_cifre(n) != numar_cifre(m):&lt;br /&gt;
        return False&lt;br /&gt;
    diferenta = 0&lt;br /&gt;
    while n &amp;gt; 0:&lt;br /&gt;
        if n % 10 != m % 10:&lt;br /&gt;
            diferenta += 1&lt;br /&gt;
        if diferenta &amp;gt; 1:&lt;br /&gt;
            return False&lt;br /&gt;
        n //= 10&lt;br /&gt;
        m //= 10&lt;br /&gt;
    return diferenta == 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def numara_aproape(n):&lt;br /&gt;
    cnt = 0&lt;br /&gt;
    for i in range(1, 10):&lt;br /&gt;
        m = n - (n % 10) + i&lt;br /&gt;
        if m != n and este_aproape(n, m):&lt;br /&gt;
            cnt += 1&lt;br /&gt;
        m = n - (n % 10) - i&lt;br /&gt;
        if m != n and este_aproape(n, m):&lt;br /&gt;
            cnt += 1&lt;br /&gt;
    return cnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def rezolva_problema(v, n):&lt;br /&gt;
    if v == 1:&lt;br /&gt;
        return numar_cifre(n)&lt;br /&gt;
    elif v == 2:&lt;br /&gt;
        return numara_aproape(n)&lt;br /&gt;
    elif v == 3:&lt;br /&gt;
        cnt_aproape = numara_aproape(n)&lt;br /&gt;
        cnt_total = cnt_aproape&lt;br /&gt;
        for i in range(1, 10):&lt;br /&gt;
            m = n - (n % 10) + i&lt;br /&gt;
            if m != n:&lt;br /&gt;
                cnt_total += numara_aproape(m)&lt;br /&gt;
            m = n - (n % 10) - i&lt;br /&gt;
            if m != n:&lt;br /&gt;
                cnt_total += numara_aproape(m)&lt;br /&gt;
        return cnt_total&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;#039;__main__&amp;#039;:&lt;br /&gt;
    with open(&amp;#039;aproape.in&amp;#039;, &amp;#039;r&amp;#039;) as fin:&lt;br /&gt;
        v = int(fin.readline().strip())&lt;br /&gt;
        n = int(fin.readline().strip())&lt;br /&gt;
    if verifica_restricții(v, n):&lt;br /&gt;
        print(&amp;#039;Datele sunt introduse corect.&amp;#039;)&lt;br /&gt;
        rezultat = rezolva_problema(v, n)&lt;br /&gt;
        with open(&amp;#039;aproape.out&amp;#039;, &amp;#039;w&amp;#039;) as fout:&lt;br /&gt;
            fout.write(str(rezultat) + &amp;#039;\n&amp;#039;)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;#039;Datele nu au fost introduse corect.&amp;#039;)&lt;br /&gt;
            &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Explicație rezolvare ==&lt;br /&gt;
Funcția &amp;#039;&amp;#039;&amp;#039;verifica_restricții(v, n)&amp;#039;&amp;#039;&amp;#039; verifică dacă valorile din fișier sunt valide. v poate fi doar 1, 2 sau 3, iar n trebuie să fie un număr între 0 și 999999999. Dacă valorile  nu sunt valide, funcția returnează False, altfel returnează True.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Funcția &amp;#039;&amp;#039;&amp;#039;numar_cifre(n)&amp;#039;&amp;#039;&amp;#039; primește un număr n și returnează numărul de cifre din acesta.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Funcția &amp;#039;&amp;#039;&amp;#039;este_aproape(n, m)&amp;#039;&amp;#039;&amp;#039; primește două numere n și m și returnează True dacă cele două numere sunt diferite doar într-o singură cifră.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Funcția &amp;#039;&amp;#039;&amp;#039;numara_aproape(n)&amp;#039;&amp;#039;&amp;#039;primește un număr n și calculează câte numere sunt aproape de n, adică diferă de n doar într-o singură cifră.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;Funcția &amp;#039;&amp;#039;&amp;#039;rezolva_problema(v, n)&amp;#039;&amp;#039;&amp;#039; primește un număr v și un număr n și returnează un rezultat bazat pe valorile de input. Dacă v este 1, atunci funcția returnează numărul de cifre din n. Dacă v este 2, funcția returnează numărul de numere apropiate de n. Dacă v este 3, funcția calculează numărul total de numere apropiate de n și toate numerele apropiate de n cu o singură cifră diferită.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;În blocul &amp;#039;&amp;#039;&amp;#039;if __name__ == &amp;#039;__main__&amp;#039;:&amp;#039;&amp;#039;&amp;#039;, programul începe prin citirea valorilor de input din fișierul &amp;quot;aproape.in&amp;quot;. Dacă valorile de input sunt valide, atunci se calculează rezultatul și se scrie în fișierul &amp;quot;aproape.out&amp;quot;. Dacă valorile de input nu sunt valide, atunci se afișează un mesaj de eroare.&lt;/div&gt;</summary>
		<author><name>Tamas Claudia</name></author>
	</entry>
</feed>