<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.algopedia.ro/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bella</id>
	<title>Algopedia - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.algopedia.ro/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Bella"/>
	<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php/Special:Contributions/Bella"/>
	<updated>2026-04-12T17:01:57Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_6-a_TEMP&amp;diff=18318</id>
		<title>Clasa a 6-a TEMP</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_6-a_TEMP&amp;diff=18318"/>
		<updated>2024-01-14T14:59:10Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Note de curs ==&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/6 temp]&lt;br /&gt;
* [[Clasa a VI-a lecția 1 ]]  Recapitulare: Algoritmi elementari; prelucrarea cifrelor unui numar, divizori, primalitate, descompunere in factori primi&lt;br /&gt;
&lt;br /&gt;
* [[Clasa a VI-a lecția 2 ]] Complexitatea algoritmilor; Recapitulare: secvente, vectori caracteristici,&lt;br /&gt;
* [[Clasa a VI-a lecția 3 ]] Complexitatea algoritmilor; Recapitulare: vectori - algoritmi de sortare&lt;br /&gt;
* [[Clasa a VI-a lecția 4 ]] Divizibilitate: Ciurul lui Eratostene; Formula lui Legendre; calculul multiplicitatii unui numar in n!&lt;br /&gt;
* [[Clasa a VI-a lecția 5 ]] Concurs1; Stiva; Santinele &lt;br /&gt;
* [[Clasa a VI-a lecția 6 ]] &lt;br /&gt;
* [[Clasa a VI-a lecția 7 ]] Baze de numeratie&lt;br /&gt;
* [[Clasa a VI-a lecția 8 ]]Tipuri de constante; Define; Debug; Corectare probleme din concursuri;&lt;br /&gt;
* [[Clasa a VI-a lecția 9 ]] Baze de numeratie continuare&lt;br /&gt;
* [[Clasa a VI-a lecția 10 ]] Parcurgerea circulara a unuivector; Probleme ONI &lt;br /&gt;
* [[Clasa a VI-a lecția 11 ]] Introducere in matrice ( reluare ); Aplicatii matrice; matrice tridimensionala&lt;br /&gt;
* [[TEMA 11]] Diagonal, Zoom, &lt;br /&gt;
* [[Clasa a VI-a lecția 12 ]] &lt;br /&gt;
* [[Clasa a VI-a lecția 13 ]]&lt;br /&gt;
* [[Clasa a VI-a lecția 14 ]]&lt;br /&gt;
* [[Clasa a VI-a lecția 15 ]]&lt;br /&gt;
* [[Clasa a VI-a lecția 16 ]]&lt;br /&gt;
* [[Clasa a VI-a lecția 17]]&lt;br /&gt;
* [[Clasa a VI-a lecția 18 ]]&lt;br /&gt;
* [[Clasa a VI-a lecția 19 ]]&lt;br /&gt;
* [[Clasa a VI-a lecția 20 ]]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia6&amp;diff=18317</id>
		<title>10 2018 Lectia6</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia6&amp;diff=18317"/>
		<updated>2024-01-14T14:40:09Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia3&amp;diff=18316</id>
		<title>10 2018 Lectia3</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia3&amp;diff=18316"/>
		<updated>2024-01-14T14:39:49Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia1&amp;diff=18315</id>
		<title>10 2018 Lectia1</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia1&amp;diff=18315"/>
		<updated>2024-01-14T14:39:25Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia15&amp;diff=18314</id>
		<title>10 2018 Lectia15</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia15&amp;diff=18314"/>
		<updated>2024-01-14T14:38:34Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia15&amp;diff=18313</id>
		<title>10 2018 Lectia15</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia15&amp;diff=18313"/>
		<updated>2024-01-14T11:56:34Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Structuri de date elementare =&lt;br /&gt;
Stivele şi cozile sunt mulţimi dinamice în care elementul care este eliminat din mulţime de către operaţia Şterge este prespecificat. Într-o stivă, elementul şters din mulţime este elementul cel mai recent inserat: stiva implementează principiul ultimul sosit, primul servit (last-in, first-out) sau LIFO. Similar, într-o coadă, elementul şters este întotdeauna cel care a stat în mulţime cel mai mult (primul introdus): coada implementează principiul primul sosit, primul servit (first-in, first-out) sau FIFO. Există mai multe modalităţi eficiente de a implementa stivele şi cozile cu ajutorul calculatorului. Aici vom arăta cum se pot folosi tablourile simple pentru a implementa fiecare dintre aceste structuri.&lt;br /&gt;
== Stive ==&lt;br /&gt;
Operaţia Inserează asupra stivelor este deseori denumită Pune-În-Stivă ( &#039;&#039;&#039;Push&#039;&#039;&#039; ).&lt;br /&gt;
Operaţia Şterge, care nu cere nici un argument, este deseori numită Scoate-Din-Stivă ( &#039;&#039;&#039;Pop&#039;&#039;&#039; ). &lt;br /&gt;
Aceste nume sunt aluzii la stivele fizice, ca de exemplu un vraf de farfurii. Ordinea în care sunt luate farfuriile din vraf este ordinea inversă în care au fost introduse în vraf, deoarece doar ultima farfurie este accesibilă.&lt;br /&gt;
O stivă cu cel mult &#039;&#039;&#039;n&#039;&#039;&#039; elemente poate fi implementată printr-un tablou &#039;&#039;&#039;st[0..n-1]&#039;&#039;&#039;. &lt;br /&gt;
Tabloul are un atribut &#039;&#039;&#039;vf&#039;&#039;&#039; care este indicele noii locatii in care se va insera un nou element. &lt;br /&gt;
Stiva constă din elementele st[0..vf-1], unde st[0] este elementul de la baza stivei, iar st[vf-1] este elementul din vârful stivei, ultimul element al stivei.&lt;br /&gt;
Când vf = 0, stiva nu conţine nici un element şi deci este vidă. Se poate testa dacă stiva este vidă prin operaţia de interogare Stivă-Vidă&#039;&#039;&#039;( empty ) &#039;&#039;&#039;. Dacă se încearcă extragerea (se apelează operaţia Scoate-Din-Stivă) unui element dintr-o stivă vidă, spunem că stiva are depăşire inferioară, care în mod normal este o eroare. Dacă vf depăşeşte valoarea n, stiva are depăşire superioară. (În implementarea noastră nu ne vom pune problema depăşirii stivei.) Fiecare dintre operaţiile stivei pot fi implementate prin doar câteva linii de cod.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int st[100], int vf;&lt;br /&gt;
bool Stiva_Vida( ){&lt;br /&gt;
  if ( vf == 0 )&lt;br /&gt;
    return true;&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
void Push ( int x ){&lt;br /&gt;
  st[vf++] = x;&lt;br /&gt;
}&lt;br /&gt;
int Pop ( ){&lt;br /&gt;
  if ( Stiva_Vida () ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;nu avem elem in stiva, depasire inferioara&amp;quot;;&lt;br /&gt;
    return -1;&lt;br /&gt;
  }&lt;br /&gt;
  vf --;&lt;br /&gt;
  return st[vf];&lt;br /&gt;
}&lt;br /&gt;
Fiecare dintre cele trei operaţii asupra stivelor necesită un timp O(1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aplicatii cu Stive == &lt;br /&gt;
===[https://www.pbinfo.ro/probleme/875/stiva stiva] ===&lt;br /&gt;
&lt;br /&gt;
Să se scrie un program care gestionează o stivă de numere întregi. Inițial stiva este vidă. Programul va citi de la tastatură o listă de operații, care pot fi:&lt;br /&gt;
&lt;br /&gt;
push X – adaugă valoarea întreagă X pe stivă;&lt;br /&gt;
pop – elimină elementul din vârful stivei;&lt;br /&gt;
top – afișează elementul din vârful stivei.&lt;br /&gt;
Programul va realiza asupra stivei operațiile citite, în ordine. Afișările se fac pe ecran, câte o valoare pe linie.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include&amp;lt;string.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n = 0, nr, x;&lt;br /&gt;
  int st[1001];&lt;br /&gt;
  cin &amp;gt;&amp;gt; nr;&lt;br /&gt;
  char op[20];&lt;br /&gt;
  for( int i = 0; i &amp;lt; nr; i++ ){&lt;br /&gt;
    cin &amp;gt;&amp;gt; op;&lt;br /&gt;
    if( strcmp( op,&amp;quot;push&amp;quot; ) == 0 ){&lt;br /&gt;
      cin &amp;gt;&amp;gt; x;&lt;br /&gt;
      st[n++] = x;&lt;br /&gt;
    }&lt;br /&gt;
    else if( strcmp( op, &amp;quot;pop&amp;quot; ) == 0 )&lt;br /&gt;
      if ( n &amp;gt; 0 )&lt;br /&gt;
        n --;&lt;br /&gt;
    else   // if(strcmp(op,&amp;quot;top&amp;quot;) == 0 )&lt;br /&gt;
      if ( n &amp;gt; 0 )&lt;br /&gt;
        cout &amp;lt;&amp;lt; st[n-1] &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Scris cu functii :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
//VARIANTA 2&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int kMax = 1000;&lt;br /&gt;
&lt;br /&gt;
int stk[kMax + 1];&lt;br /&gt;
int k = 0;&lt;br /&gt;
&lt;br /&gt;
// Verifica daca stiva este vida&lt;br /&gt;
bool empty() {&lt;br /&gt;
    if (k == 0) {&lt;br /&gt;
        return true;&lt;br /&gt;
    } else {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Adauga element in stiva&lt;br /&gt;
void push(int x) {&lt;br /&gt;
    stk[k] = x;&lt;br /&gt;
    k++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Afiseaza varful stivei&lt;br /&gt;
void top() {&lt;br /&gt;
    if (!empty()) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; stk[k - 1] &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Sterge varful stivei&lt;br /&gt;
void pop() {&lt;br /&gt;
    if (!empty()) {&lt;br /&gt;
        k--;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        char s[10];&lt;br /&gt;
        // citeste un cuvant pana la primul spatiu (sau tab sau enter)&lt;br /&gt;
        cin &amp;gt;&amp;gt; s;&lt;br /&gt;
&lt;br /&gt;
        if (s[0] == &#039;t&#039;) {&lt;br /&gt;
            // operatia &amp;quot;top&amp;quot;&lt;br /&gt;
            top();&lt;br /&gt;
        } else if (s[1] == &#039;o&#039;) {&lt;br /&gt;
            // operatia &amp;quot;pop&amp;quot;&lt;br /&gt;
            pop();&lt;br /&gt;
        } else {&lt;br /&gt;
            // operatia &amp;quot;push x&amp;quot;&lt;br /&gt;
            int x;&lt;br /&gt;
            cin &amp;gt;&amp;gt; x;&lt;br /&gt;
            push(x);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
//VARIANTA 2&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include&amp;lt;string.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
void push ( int st[], int &amp;amp;n, int x ){ // n e nr de elem din stiva&lt;br /&gt;
   st[n++] = x;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void pop( int st[], int &amp;amp;n ){&lt;br /&gt;
  if ( n &amp;gt; 0 )             // daca avem ce sa scoatem&lt;br /&gt;
    n --;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void top( int st[], int n ){&lt;br /&gt;
  if ( n &amp;gt; 0 )&lt;br /&gt;
    cout &amp;lt;&amp;lt; st[n-1] &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  //ifstream fin(&amp;quot;date.in&amp;quot;);&lt;br /&gt;
  int n = 0, nr, x;&lt;br /&gt;
  int st[1001];&lt;br /&gt;
  cin &amp;gt;&amp;gt; nr;&lt;br /&gt;
  char op[20];&lt;br /&gt;
  for( int i = 0; i &amp;lt; nr; i++ ){&lt;br /&gt;
    cin &amp;gt;&amp;gt; op;&lt;br /&gt;
    if( strcmp( op,&amp;quot;push&amp;quot;) == 0 ){&lt;br /&gt;
      cin &amp;gt;&amp;gt; x;&lt;br /&gt;
      push( st, n, x );&lt;br /&gt;
    }&lt;br /&gt;
    else if( strcmp( op, &amp;quot;pop&amp;quot; ) == 0 )&lt;br /&gt;
      pop( st, n );&lt;br /&gt;
    else   // if(strcmp(op,&amp;quot;top&amp;quot;) == 0 )&lt;br /&gt;
      top( st, n );&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// CU STL - STACK&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;stack&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  stack &amp;lt;int&amp;gt; s;&lt;br /&gt;
  int c , x;&lt;br /&gt;
  string op;&lt;br /&gt;
  cin &amp;gt;&amp;gt; c;&lt;br /&gt;
  for( int i = 1 ; i &amp;lt;= c ; i++ ) {&lt;br /&gt;
    cin &amp;gt;&amp;gt; op;&lt;br /&gt;
    if( op == &amp;quot;push&amp;quot;) {&lt;br /&gt;
      cin &amp;gt;&amp;gt; x;&lt;br /&gt;
      s.push(x);&lt;br /&gt;
    }&lt;br /&gt;
    else if( op == &amp;quot;top&amp;quot; )&lt;br /&gt;
      cout &amp;lt;&amp;lt; s.top() &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    else &lt;br /&gt;
      s.pop();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/848/paranteze1 paranteze1] ===&lt;br /&gt;
Se dau n șiruri de paranteze rotunde. Să se stabilească, despre fiecare șir, dacă este corect parantezat – adică dacă parantezele se închid corect.&lt;br /&gt;
Un șir de paranteze S rotunde este corect parantezat dacă:&lt;br /&gt;
* S este șirul vid, sau&lt;br /&gt;
* S = (T) și T este corect parantezat, sau&lt;br /&gt;
* S = AB, iar A și B sunt corect parantezate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;paranteze1.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;paranteze1.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n;&lt;br /&gt;
    char st[255], c;&lt;br /&gt;
    fin &amp;gt;&amp;gt; n;&lt;br /&gt;
    fin.get( c );&lt;br /&gt;
    for ( int i = 0; i &amp;lt; n; i ++ ) {&lt;br /&gt;
      int k = 0;&lt;br /&gt;
      c = fin.get( );&lt;br /&gt;
      while ( c != &#039;\n&#039; &amp;amp;&amp;amp; c!= EOF ) {&lt;br /&gt;
        if ( k &amp;amp;&amp;amp; st[k-1] == &#039;(&#039; &amp;amp;&amp;amp; c == &#039;)&#039; )&lt;br /&gt;
          k --;&lt;br /&gt;
        else {&lt;br /&gt;
          st[k++] = c;&lt;br /&gt;
        }&lt;br /&gt;
        c = fin.get( );&lt;br /&gt;
      }&lt;br /&gt;
      fout &amp;lt;&amp;lt; ( k == 0 ) &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/877/cuburi2 cuburi2]===&lt;br /&gt;
Gigel are un set de n cuburi. Fiecare cub este marcat cu un număr natural, de la 1 la n și i se cunoaște lungimea laturii – număr natural. Cu o parte dintre aceste cuburi Gigel va construi o stivă, astfel:&lt;br /&gt;
&lt;br /&gt;
fiecare cub se analizează o singură dată, în ordinea numerelor marcate;&lt;br /&gt;
dacă stiva nu conține niciun cub, cubul curent devine baza stivei&lt;br /&gt;
dacă cubul curent are latura mai mică sau egală cu cubul din vârful stive, se adaugă pe stivă;&lt;br /&gt;
dacă cubul curent are latura mai mare decât cubul din vârful stivei, se vor înlătura de pe stivă cuburi (eventual toate) până când cubul curent are latura mai mică sau egală cu cubul din vârful stivei.&lt;br /&gt;
Să se afișeze numerele de pe cuburile existente la final în stivă, de la bază spre vârf.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int st[1000], ind[1000];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, a;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  int k = 0; // cate elem am in stiva&lt;br /&gt;
  for( int i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
    cin &amp;gt;&amp;gt; a;&lt;br /&gt;
    while( k &amp;gt; 0 &amp;amp;&amp;amp; st[k-1] &amp;lt; a )   // st nu e vida ultima val din stiva =&amp;gt; st[k-1]&lt;br /&gt;
      k--;&lt;br /&gt;
    st[k] = a;&lt;br /&gt;
    ind[k] = i;&lt;br /&gt;
    k++;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; k &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
  for( int i = 0; i &amp;lt; k; i++ )&lt;br /&gt;
     cout &amp;lt;&amp;lt; ind[i] + 1 &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/2650/books books]===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int v[200000];&lt;br /&gt;
int f[200001];&lt;br /&gt;
int main (){&lt;br /&gt;
  int n, i, nr;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
  int k = -1;&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
    cin &amp;gt;&amp;gt; nr;&lt;br /&gt;
    if ( f[nr] )          // dc nr a fost deja pus in ghiozdan&lt;br /&gt;
      cout &amp;lt;&amp;lt; &amp;quot;0 &amp;quot;;       // mut 0 carti&lt;br /&gt;
    else {                // inaintez in stiva pana gasesc cartea nr&lt;br /&gt;
      int cnt = 0;&lt;br /&gt;
      do {&lt;br /&gt;
        k ++;&lt;br /&gt;
        f[v[k]] = 1;       // marchez ce carti am pus deja in ghiozdan in verctor de frecventa&lt;br /&gt;
        cnt ++;&lt;br /&gt;
      } while ( v[k] != nr );&lt;br /&gt;
      cout &amp;lt;&amp;lt; cnt &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/848/paranteze1 paranteze1]===&lt;br /&gt;
Se dau n șiruri de paranteze rotunde. Să se stabilească, despre fiecare șir, dacă este corect parantezat.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;paranteze1.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;paranteze1.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n;&lt;br /&gt;
    char st[255], c;&lt;br /&gt;
    fin &amp;gt;&amp;gt; n;&lt;br /&gt;
    fin.get( c );&lt;br /&gt;
    for ( int i =0; i &amp;lt; n; i ++ ){&lt;br /&gt;
      int k = 0;&lt;br /&gt;
      c = fin.get( );&lt;br /&gt;
      while ( c != &#039;\n&#039; &amp;amp;&amp;amp; c!= EOF ){&lt;br /&gt;
        if ( k &amp;amp;&amp;amp; st[k-1] == &#039;(&#039; &amp;amp;&amp;amp; c == &#039;)&#039; )&lt;br /&gt;
          k --;&lt;br /&gt;
        else {&lt;br /&gt;
          st[k++] = c;&lt;br /&gt;
        }&lt;br /&gt;
        c = fin.get( );&lt;br /&gt;
      }&lt;br /&gt;
      fout &amp;lt;&amp;lt; ( k == 0 ) &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/849/paranteze2 paranteze2]===&lt;br /&gt;
 Atentie !!! Citirea cu fin.get(c) nu merge. Nu se citeste EOF_ul in c, in schimb functia returneaza EOF.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;paranteze2.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;paranteze2.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
&lt;br /&gt;
    char st[255], c;&lt;br /&gt;
    int k = 0;&lt;br /&gt;
    int vmax = 0;&lt;br /&gt;
    c = fin.get( );&lt;br /&gt;
    while ( c != &#039;\n&#039; &amp;amp;&amp;amp; c!= EOF ){&lt;br /&gt;
      if (  c == &#039;)&#039; )&lt;br /&gt;
        k --;&lt;br /&gt;
      else {&lt;br /&gt;
        st[k++] = c;&lt;br /&gt;
        if ( vmax &amp;lt; k )&lt;br /&gt;
          vmax = k;&lt;br /&gt;
      }&lt;br /&gt;
      c = fin.get(  );&lt;br /&gt;
    }&lt;br /&gt;
    fout &amp;lt;&amp;lt; vmax &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// CU STL -STACK&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#include &amp;lt;stack&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
bool match(char a, char b) {&lt;br /&gt;
    if (a == &#039;(&#039; &amp;amp;&amp;amp; b == &#039;)&#039;)&lt;br /&gt;
        return true;&lt;br /&gt;
    if (a == &#039;[&#039; &amp;amp;&amp;amp; b == &#039;]&#039;)&lt;br /&gt;
        return true;&lt;br /&gt;
    return false;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    ifstream in(&amp;quot;paranteze3.in&amp;quot;);&lt;br /&gt;
    ofstream out(&amp;quot;paranteze3.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    int t;&lt;br /&gt;
    bool add;&lt;br /&gt;
    string s;&lt;br /&gt;
    stack&amp;lt;char&amp;gt; st;&lt;br /&gt;
    in &amp;gt;&amp;gt; t;&lt;br /&gt;
    while (t--) {&lt;br /&gt;
        in &amp;gt;&amp;gt; s;&lt;br /&gt;
        while (!st.empty())&lt;br /&gt;
            st.pop();&lt;br /&gt;
        for (auto c : s) {&lt;br /&gt;
            add = true;&lt;br /&gt;
            while (!st.empty() &amp;amp;&amp;amp; match(st.top(), c)) {&lt;br /&gt;
                add = false;&lt;br /&gt;
                st.pop();&lt;br /&gt;
                if (!st.empty())&lt;br /&gt;
                    c = st.top();&lt;br /&gt;
            }&lt;br /&gt;
            if (add)&lt;br /&gt;
                st.push(c);&lt;br /&gt;
        }&lt;br /&gt;
        if (st.empty())&lt;br /&gt;
            out &amp;lt;&amp;lt; &amp;quot;1\n&amp;quot;;&lt;br /&gt;
        else&lt;br /&gt;
            out &amp;lt;&amp;lt; &amp;quot;0\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    in.close();&lt;br /&gt;
    out.close();&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/852/paranteze3 paranteze3]===&lt;br /&gt;
Se dau n șiruri de paranteze rotunde sau pătrate. Să se stabilească, despre fiecare șir, dacă este corect parantezat.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;paranteze3.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;paranteze3.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n;&lt;br /&gt;
    char st[255], c;&lt;br /&gt;
    fin &amp;gt;&amp;gt; n;&lt;br /&gt;
    fin.get( c );&lt;br /&gt;
    for ( int i = 0; i &amp;lt; n; i ++ ) {&lt;br /&gt;
      int k = 0;&lt;br /&gt;
      c = fin.get();&lt;br /&gt;
      while ( c != &#039;\n&#039; &amp;amp;&amp;amp; c!= EOF ) {&lt;br /&gt;
        if ( k &amp;amp;&amp;amp; ( st[k-1] == &#039;(&#039; &amp;amp;&amp;amp; c == &#039;)&#039; || st[k-1] == &#039;[&#039; &amp;amp;&amp;amp; c == &#039;]&#039;))&lt;br /&gt;
          k --;&lt;br /&gt;
        else {&lt;br /&gt;
          st[k++] = c;&lt;br /&gt;
        }&lt;br /&gt;
        c = fin.get();&lt;br /&gt;
      }&lt;br /&gt;
      fout &amp;lt;&amp;lt; ( k == 0 ) &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/2650/books books]===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* https://www.varena.ro/problema/betisoare&lt;br /&gt;
&lt;br /&gt;
== Cozi ==&lt;br /&gt;
Vom numi Pune-În-Coadă ( Push ) operaţia de inserare aplicată asupra unei cozi, iar operaţia de stergere o vom numi Scoate-Din-Coadă ( Pop ); asemănător operaţiei Scoate-Din-Stivă aplicată stivei, Scoate-Din-Coadă nu necesită nici un argument. &lt;br /&gt;
Principiul FIFO, propriu cozii, impune ca aceasta să opereze asemănător cu un rând de oameni ce aşteaptă la un ghişeu. Coada are un cap şi o coadă. Când un element este pus în coadă, ocupă locul de la sfârşitul cozii, ca şi un nou venit ce îşi ia locul la coada rândului. Elementul scos din coadă este întotdeauna cel din capul cozii, asemănător persoanei din capul rândului care a aşteptat cel mai mult. &lt;br /&gt;
O modalitate de a implementa o coadă având cel mult n − 1 elemente, foloseste un tablou Q[0..n-1]. &lt;br /&gt;
Coada are un atribut &#039;&#039;&#039;in&#039;&#039;&#039;, capul cozii, care conţine indicele capului ei si un atributul &#039;&#039;&#039;sf&#039;&#039;&#039;, sfarsitul cozii, ce conţine indicele noii locaţii în care se va insera în coadă elementul nou venit. &lt;br /&gt;
Elementele din coadă se află în locaţiile cap, cap + 1, ..., coada − 1, iar indicii se parcurg circular, în sensul că locaţia 0 urmează imediat după locaţia n-1. Când cap = coada, coada este goală.&lt;br /&gt;
Iniţial avem in = sf = 0. Când coada este vidă, o încercare de a scoate un element din coadă cauzează o depăşire inferioară în coadă. Când cap = coada + 1, coada este “plină” şi o încercare de a pune în coadă cauzează o depăşire superioară în coadă.&lt;br /&gt;
În Pune-În-Coadă şi Scoate-Din-Coadă, verificarea erorilor de depăşire inferioară a fost omisă. &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
const int NMAX = 100;&lt;br /&gt;
int Q[NMAX], in, sf;&lt;br /&gt;
&lt;br /&gt;
void Push ( int x ){&lt;br /&gt;
  Q[sf] = x;&lt;br /&gt;
  sf = (sf + 1 ) % NMAX;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Pop () {&lt;br /&gt;
  int x = Q[in];&lt;br /&gt;
  in = ( int + 1 ) % NMAX;&lt;br /&gt;
  return x;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercitii ==&lt;br /&gt;
*  Explicaţi cum se pot implementa două stive într-un singur tablou astfel încât nici una dintre stive să nu aibă depăşire superioară, cu excepţia cazului în care numărul total de elemente din ambele stive (împreună) este n. Operaţiile Pune-În-Stivă şi Scoate-Din-Stivă trebuie să funcţioneze într-un timp O(1).&lt;br /&gt;
* Rescrieţi Pune-În-Coadă şi Scoate-Din-Coadă pentru a detecta depăşirile unei cozi.&lt;br /&gt;
* În timp ce stiva permite inserarea şi ştergerea de elemente doar la un singur capăt, iar coada permite inserarea la un capăt şi ştergerea la celălalt capăt, o coadă completă permite&lt;br /&gt;
inserări şi ştergeri la ambele capete. Scrieţi patru proceduri cu timpul de execuţie O(1) pentru&lt;br /&gt;
inserare de elemente şi ştergere de elemente la ambele capete ale unei cozi complete implementată&lt;br /&gt;
printr-un tablou.&lt;br /&gt;
* Arătaţi cum se poate implementa o coadă prin două stive. Analizaţi timpul de execuţie pentru operaţiile cozii.&lt;br /&gt;
* Arătaţi cum se poate implementa o stivă prin două cozi. Analizaţi timpul de execuţie pentru operaţiile stivei.&lt;br /&gt;
&lt;br /&gt;
= Tema Stiva =&lt;br /&gt;
Probleme Pbinfo:&lt;br /&gt;
https://www.pbinfo.ro/probleme/870/depou&lt;br /&gt;
ecuatie1 , Stiva , Cuburi2 , Depou , Paranteze1 , Paranteze4 , Paranteze3 , Paranteze2 , minlex , eval_exp , eval_exp2&lt;br /&gt;
&lt;br /&gt;
Probleme Varena&lt;br /&gt;
* [http://varena.ro/problema/bile2 bile2] dată la concursul .campion 2005&lt;br /&gt;
* [http://varena.ro/problema/turn turn] dată la ONI 2007 clasa a 6&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [http://varena.ro/problema/paranteze1 paranteze1] dată ca temă la cercul IQ Academy 2018 clasa a 6&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [http://varena.ro/problema/swap swap] dată la ONI 2013 baraj gimnaziu&lt;br /&gt;
&lt;br /&gt;
Probleme Infoarena&lt;br /&gt;
* [http://infoarena.ro/problema/editor editor]&lt;br /&gt;
* [http://infoarena.ro/problema/trompeta trompeta]&lt;br /&gt;
GREA&lt;br /&gt;
* [http://infoarena.ro/problema/identice identice]&lt;br /&gt;
&lt;br /&gt;
= Bibliografie =&lt;br /&gt;
* Introducere in algoritmi, Thomas Cormen&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Tema Rezolvari =&lt;br /&gt;
Probleme Varena&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=382 bile3] dată la concursul .campion 2005&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int  in[2000], st[2000];&lt;br /&gt;
char out[4000];&lt;br /&gt;
int main(){&lt;br /&gt;
  FILE *fin = fopen( &amp;quot;bile2.in&amp;quot;,&amp;quot;r&amp;quot; );&lt;br /&gt;
  FILE *fout = fopen( &amp;quot;bile2.out&amp;quot;,&amp;quot;w&amp;quot; );&lt;br /&gt;
  int i, n, b, kin, kout , k;&lt;br /&gt;
 &lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
  for(i=0;i&amp;lt;n;i++)&lt;br /&gt;
    fscanf(fin,&amp;quot;%d&amp;quot;,&amp;amp;in[i]);&lt;br /&gt;
 &lt;br /&gt;
  kin = 0;    //nivel in (zona A)&lt;br /&gt;
  k = 0;      //nivel stiva (zona B)&lt;br /&gt;
  kout = 0;   //nivel sol ( in sol voi tine sirul de Intrari/Iesiri )&lt;br /&gt;
 &lt;br /&gt;
  //citesc pe rand bilele care trebuie sa ajunga in out&lt;br /&gt;
  //pentru fiecare bila verific, apas I cata vreme nu am in varful stifei b&lt;br /&gt;
  //daca b a ajuns in varful stivei, apas out,&lt;br /&gt;
  //daca nu am reusit sa scot bila b, nu are sens sa mai incerc scoarerea celorlalte bile&lt;br /&gt;
  //daca am reusit sa scot o bila, atunci valoarea ei, a ramas pe nibelul k al stivei&lt;br /&gt;
 &lt;br /&gt;
  b = 0;   // pentru ca b == st[k] sa fie adevarata la primul pas&lt;br /&gt;
  for( i = 0; i &amp;lt; n &amp;amp;&amp;amp; b == st[k]; i++ ){&lt;br /&gt;
    fscanf( fin,&amp;quot;%d&amp;quot;, &amp;amp;b );&lt;br /&gt;
    //cat timp mai am bile in in si nu am in varvul stivei val b&lt;br /&gt;
    //gasit = 0;&lt;br /&gt;
    while( ( kin &amp;lt; n &amp;amp;&amp;amp; ( k &amp;gt; 0 &amp;amp;&amp;amp; st[k-1] != b ) || k == 0 ) ){&lt;br /&gt;
      out[kout++] = &#039;I&#039;;    //apas I&lt;br /&gt;
      st[k++] = in[kin];    //mut bila din in in stiva&lt;br /&gt;
      kin ++;               //avensez in vectorul in&lt;br /&gt;
    }&lt;br /&gt;
    if( k &amp;gt; 0 &amp;amp;&amp;amp; st[k-1] == b ){  //daca stiva nu e vida si in varv am bila potrivita&lt;br /&gt;
      out[kout++] = &#039;O&#039;;    //apas o&lt;br /&gt;
      k --;&lt;br /&gt;
      //gasit = 1;            //scad nivelul in stiva&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if( kout == 2*n )  //daca in solutie am 2*n mutari ( n in-uri si n out- uri)&lt;br /&gt;
    for( i=0; i &amp;lt; kout; i++ )&lt;br /&gt;
      fputc( out[i], fout );&lt;br /&gt;
  else&lt;br /&gt;
    fprintf(fout,&amp;quot;imposibil&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
  fclose( fin );&lt;br /&gt;
  fclose( fout );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [http://varena.ro/problema/turn turn] dată la ONI 2007 clasa a 6&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* [http://varena.ro/problema/paranteze1 paranteze1] dată ca temă la cercul IQ Academy 2018 clasa a 6&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;paranteze1.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;paranteze1.out&amp;quot; );&lt;br /&gt;
const int NMAX = 1000000;&lt;br /&gt;
int main(){&lt;br /&gt;
    int n;&lt;br /&gt;
&lt;br /&gt;
    char st[NMAX], c;&lt;br /&gt;
    int k = 0;        // nivelul in stiva&lt;br /&gt;
    int kmax = 0;     // gradul maxim de imbricare&lt;br /&gt;
    c = fin.get();&lt;br /&gt;
    while ( c != &#039;\n&#039; ) {&lt;br /&gt;
      if ( k &amp;amp;&amp;amp; ( st[k-1] == &#039;(&#039; &amp;amp;&amp;amp; c == &#039;)&#039; || st[k-1] == &#039;{&#039; &amp;amp;&amp;amp; c == &#039;}&#039;))&lt;br /&gt;
        k --;&lt;br /&gt;
      else {&lt;br /&gt;
        st[k++] = c;&lt;br /&gt;
        if ( k &amp;gt; kmax )&lt;br /&gt;
          kmax = k;&lt;br /&gt;
      }&lt;br /&gt;
      c = fin.get();&lt;br /&gt;
    }&lt;br /&gt;
    if ( k )&lt;br /&gt;
      fout &amp;lt;&amp;lt; -1;&lt;br /&gt;
    else&lt;br /&gt;
      fout &amp;lt;&amp;lt; kmax;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== [http://varena.ro/problema/swap swap] dată la ONI 2013 baraj gimnaziu ====&lt;br /&gt;
Pentru calcularea costului parantezarii, vom retine o stiva cu pozitiile parantezelor. Orice paranteza inchisa va inchide ultima paranteza deschisa, pentru care s-a memorat pe stiva pozitia sa i ncadrul vectorului. &lt;br /&gt;
Pentru a optimiza parantezarea, vom incerca sa inchidem o paranteza mai devreme, daca e posibil.  Orice swap efectuam va imbunatati costul doar cu 2.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;swap.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;swap.out&amp;quot; );&lt;br /&gt;
const int NMAX = 90000;&lt;br /&gt;
int main(){&lt;br /&gt;
    int n;&lt;br /&gt;
    int st[NMAX/2];&lt;br /&gt;
    char c1, c2;&lt;br /&gt;
    int cost = 0;     // costul imbricarii&lt;br /&gt;
    int nrswap = 0;&lt;br /&gt;
    fin &amp;gt;&amp;gt; n;&lt;br /&gt;
    c1 = fin.get();&lt;br /&gt;
    int k = 0;        // nivelul in stiva&lt;br /&gt;
    for ( int i = 0; i &amp;lt; n; i ++ ) {&lt;br /&gt;
      c2 = fin.get();&lt;br /&gt;
      if ( c2 == &#039;(&#039; )&lt;br /&gt;
        st[k ++] = i;&lt;br /&gt;
      else {&lt;br /&gt;
        k -- ;&lt;br /&gt;
        cost += ( i - st[k] );&lt;br /&gt;
        if ( k &amp;gt; 0 &amp;amp;&amp;amp; c1 == &#039;(&#039; )        // daca as fi putut inchide paranteza mai devreme&lt;br /&gt;
          nrswap ++;&lt;br /&gt;
      }&lt;br /&gt;
      c1 = c2;&lt;br /&gt;
    }&lt;br /&gt;
    fout &amp;lt;&amp;lt; cost &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    if ( nrswap == 0 )&lt;br /&gt;
      fout &amp;lt;&amp;lt; -1 &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    else&lt;br /&gt;
      fout &amp;lt;&amp;lt; cost - 2 &amp;lt;&amp;lt; &#039;\n&#039;;  // orice swap reduce costul cu 2&lt;br /&gt;
    fout &amp;lt;&amp;lt; nrswap;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_8&amp;diff=18285</id>
		<title>Clasa a IX-a lecția 8</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_8&amp;diff=18285"/>
		<updated>2023-03-14T20:48:48Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Formula lui Legendre */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lectie =&lt;br /&gt;
==Descompunerea in factori primi ==&lt;br /&gt;
[https://www.pbinfo.ro/probleme/62/factorizare factorizare]&lt;br /&gt;
Se citeşte un număr natural n. Să se afişeze descompunerea în factori primi a lui n.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocod&#039;&#039;&#039;&lt;br /&gt;
  intreg n, d, p&lt;br /&gt;
  citeste n       &lt;br /&gt;
  d = 2&lt;br /&gt;
  while( d * d &amp;lt;= n )&lt;br /&gt;
    p = 0&lt;br /&gt;
    while( n % d == 0 )&lt;br /&gt;
      n = n / d&lt;br /&gt;
      p = p + 1   &lt;br /&gt;
    if( p &amp;gt; 0 )&lt;br /&gt;
      scrie d, &amp;quot; &amp;quot;, p&lt;br /&gt;
    d = d + 1&lt;br /&gt;
  if ( n &amp;gt; 1 )&lt;br /&gt;
   scrie  n, &amp;quot; &amp;quot;, 1&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d, p;&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;n);         // cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
  d = 2;&lt;br /&gt;
  while( d * d &amp;lt;= n ){&lt;br /&gt;
    p = 0;                // puterea la care apare d in descompunere&lt;br /&gt;
    while( n % d == 0 ){  // impartim repetat la d si numaram de cate ori n se imparte la d&lt;br /&gt;
      n = n / d;&lt;br /&gt;
      p = p + 1;&lt;br /&gt;
    }&lt;br /&gt;
    if( p &amp;gt; 0 )          ]// daca puterea este nenula, atunci d e factor prim&lt;br /&gt;
      printf( &amp;quot;%d %d\n&amp;quot;, d, p ); // tiparim factorul prim si puterea ( in c++ cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &amp;quot; &amp;quot;&amp;lt;&amp;lt; p &amp;lt;&amp;lt;&amp;quot;\n&amp;quot;; )&lt;br /&gt;
    d = d + 1;           &lt;br /&gt;
 }&lt;br /&gt;
 if ( n &amp;gt; 1 )            // daca n &amp;gt; 1 atunci in n a mai ramas un factor prim la puterea 1&lt;br /&gt;
   printf( &amp;quot;%d 1&amp;quot;, n );  // cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt; &amp;quot; &amp;quot; &amp;lt;&amp;lt; 1;&lt;br /&gt;
&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Variante de implementare a descompunerii in factori primi ==&lt;br /&gt;
Problema factorizare ne cere afisarea fiecarui factor prim si a puterii pe cate o linie. Este posibil insa ca formatul afisarii sa difere, de pilda, putin mai dificil, este sa afisam descompunerea in factori sub forma unui produs. Ex: Daca n = 12 vom afisa: 2^2 * 3. Putem observa ca in fata fiecarui factor va trebui sa afisam un semn *, mai putin in fata primului factor. &lt;br /&gt;
&lt;br /&gt;
====Varianta1 cu while-do ====&lt;br /&gt;
&#039;&#039;&#039;Pseudocod&#039;&#039;&#039;&lt;br /&gt;
  intreg n, p, d, pas&lt;br /&gt;
  citeste n&lt;br /&gt;
  d = 2 &lt;br /&gt;
  pas = 1&lt;br /&gt;
  while( n &amp;gt; 1 )&lt;br /&gt;
    p = 0                 &lt;br /&gt;
    while( n mod d == 0 )&lt;br /&gt;
      n = n div d&lt;br /&gt;
      p = p + 1       &lt;br /&gt;
    if( p &amp;gt; 0 )          // daca am gasit un factor prim&lt;br /&gt;
      if( pas == 1 )     // daca e primul factor&lt;br /&gt;
        scrie d, &amp;quot;^&amp;quot;, p  // afisam factorul fara steluta in fata&lt;br /&gt;
        pas = pas + 1;   // modificam variabila stegulet&lt;br /&gt;
      else               // daca nu suntem la pasul 1&lt;br /&gt;
        scrie &amp;quot; * &amp;quot;, d , &amp;quot;^&amp;quot;, p  // afisam cu *&lt;br /&gt;
    d = d + 1;           &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, p, d, pas;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );    /// cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  d = 2; pas = 1;&lt;br /&gt;
  while( n &amp;gt; 1 ){      /// cata vreme n nu a fost descompus&lt;br /&gt;
    p = 0;             /// impartim pe n la d de cate ori se poate&lt;br /&gt;
    while( n % d == 0 ){&lt;br /&gt;
      n= n / d;&lt;br /&gt;
      p = p + 1;       /// rezulta p, ca fiind puterea divizorului&lt;br /&gt;
    }&lt;br /&gt;
    if( p &amp;gt; 0 )&lt;br /&gt;
      if( pas == 1 ){&lt;br /&gt;
        printf(&amp;quot;%d^%d&amp;quot;, d, p);   /// cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &amp;quot;^&amp;quot; &amp;lt;&amp;lt; p;&lt;br /&gt;
         pas = pas + 1;&lt;br /&gt;
      }&lt;br /&gt;
      else&lt;br /&gt;
        printf(&amp;quot;*%d^%d&amp;quot;, d, p);  ///  cout &amp;lt;&amp;lt; &amp;quot;*&amp;quot;&amp;lt;&amp;lt; d &amp;lt;&amp;lt; &amp;quot;^&amp;quot; &amp;lt;&amp;lt; p;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putem privi afisarea de mai sus, ca o afisare la care dupa fiecare termen pun o steluta, mai putin dupa ultimul termen. Mai jos este implementarea acestei idei.&lt;br /&gt;
=== Varianta 2 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d, p;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );   // cin&amp;gt;&amp;gt;n;&lt;br /&gt;
  d = 2;&lt;br /&gt;
  while( n != 1 ){&lt;br /&gt;
    p = 0;&lt;br /&gt;
    while( n % d == 0 ){&lt;br /&gt;
      n = n / d;&lt;br /&gt;
      p = p + 1;&lt;br /&gt;
    }&lt;br /&gt;
    if( p != 0 )&lt;br /&gt;
      if( n == 1 )                   // daca n a devenit 1, atunci am gasit un ultim factor&lt;br /&gt;
        printf( &amp;quot;%d^%d&amp;quot;, d, p );     // cout &amp;lt;&amp;lt; d &amp;lt; &amp;lt;&amp;quot;^&amp;quot; &amp;lt;&amp;lt; p;&lt;br /&gt;
      else&lt;br /&gt;
        printf( &amp;quot;%d^%d*&amp;quot;, d, p );    // cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &amp;quot;^&amp;quot; &amp;lt;&amp;lt; p &amp;lt;&amp;lt; &amp;quot;*&amp;quot;;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
 }&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Varianta2 cu do-while ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d, p;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;,&amp;amp;n );   // cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  d = 2;&lt;br /&gt;
  do{&lt;br /&gt;
    p = 0;&lt;br /&gt;
    while( n % d == 0 ){&lt;br /&gt;
      n = n / d;&lt;br /&gt;
      p = p + 1;&lt;br /&gt;
    }&lt;br /&gt;
    if(p != 0)&lt;br /&gt;
      if(n == 1)                   // ca am gasit un ultim factor&lt;br /&gt;
        printf( &amp;quot;%d^%d&amp;quot;, d, p );   // cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &amp;quot;^&amp;quot; &amp;lt;&amp;lt;p;&lt;br /&gt;
      else&lt;br /&gt;
        printf( &amp;quot;%d^%d*&amp;quot;, d, p );  // cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &amp;quot;^&amp;quot; &amp;lt;&amp;lt; p&amp;lt;&amp;lt; &amp;quot;*&amp;quot;;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
 }while( n != 1 );&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Divizori primi ==&lt;br /&gt;
Sa se afiseze cati divizori primi are un număr n.&lt;br /&gt;
Tendinta multora cand e vorba de aceasta problema este de a parcurge toti divizorii numarului si de a-i verifica pe fiecare in parte daca sunt primi. Nu trebuie insa decat sa descompunem in factori, folosind algoritmul precedent si sa numaram factorii primi gasiti.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d, p, nrdiv = 0;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );   &lt;br /&gt;
 &lt;br /&gt;
  d = 2;&lt;br /&gt;
  while( d * d &amp;lt;= n ){&lt;br /&gt;
    p = 0;&lt;br /&gt;
    while( n % d == 0 ){&lt;br /&gt;
      n = n / d;&lt;br /&gt;
      p = p + 1;&lt;br /&gt;
    }&lt;br /&gt;
    if( p &amp;gt; 0 )&lt;br /&gt;
      nrdiv = nrdiv + 1; &lt;br /&gt;
    &lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  } &lt;br /&gt;
  if ( n &amp;gt; 1 )&lt;br /&gt;
   nrdiv = nrdiv + 1;&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;%d&amp;quot;, nrdiv );    &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Aplicatie: [https://www.pbinfo.ro/probleme/462/divprimmax divprimmax]&lt;br /&gt;
&lt;br /&gt;
== Cel mai mic divizor prim ==&lt;br /&gt;
Sa se afiseze cel mai mic divizor prim pe care il are un număr n.&lt;br /&gt;
Rezolvare1: Putem folosi algoritmul care determina divizorii unui numar din lectia precedenta, oprindu-ne la primul divizor gasit. Acesta va fi cu siguranta si divizor prim. &lt;br /&gt;
Rezolvare2: Ne vom folosi tot de descompunerea in factori primi, descompunere pe care o vom intrerupe cand am gasit primul factor primi. Iata o implementare a acestei idei.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d, p, div = 0;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );    &lt;br /&gt;
  d = 2;&lt;br /&gt;
  while( d * d &amp;lt;= n &amp;amp;&amp;amp; !div ){&lt;br /&gt;
    p = 0;&lt;br /&gt;
    while( n % d == 0 ){&lt;br /&gt;
      n = n / d;&lt;br /&gt;
      p = p + 1;&lt;br /&gt;
    }&lt;br /&gt;
    if( p &amp;gt; 0 )&lt;br /&gt;
      div = d; &lt;br /&gt;
    &lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  } &lt;br /&gt;
  if ( n &amp;gt; 1 )&lt;br /&gt;
   div = n;&lt;br /&gt;
  printf(&amp;quot;%d&amp;quot;, div );        &lt;br /&gt;
 &lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Aplicatie: [https://www.pbinfo.ro/probleme/443/divizoriprimi divizoriprimi]&lt;br /&gt;
&lt;br /&gt;
== Cel mai mare divizor prim ==&lt;br /&gt;
Sa se afiseze cel mai mare divizor prim a unui număr n?&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d, p;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  int dmax;&lt;br /&gt;
  d = 2;&lt;br /&gt;
  while( d * d &amp;lt;= n ){&lt;br /&gt;
    p = 0;&lt;br /&gt;
    while( n % d == 0 ){&lt;br /&gt;
      n = n / d;&lt;br /&gt;
      p = p + 1;&lt;br /&gt;
    }&lt;br /&gt;
    if( p &amp;gt; 0 )&lt;br /&gt;
      dmax = d;&lt;br /&gt;
    d ++;&lt;br /&gt;
  }&lt;br /&gt;
  if ( n &amp;gt; 1 )&lt;br /&gt;
   dmax = n;&lt;br /&gt;
  printf(&amp;quot;%d&amp;quot;, dmax );&lt;br /&gt;
&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Aplicatie: [https://www.pbinfo.ro/probleme/1409/numere11 numere11]&lt;br /&gt;
&lt;br /&gt;
= Formule de calcul =&lt;br /&gt;
== Formula lui Legendre ==&lt;br /&gt;
Cu ajutorul acesteia determinam exponentul unui numar prim k in descompunerea in factori primi a lui n factorial. N factorial se noteaza cu n! si e produsul primelor n numere naturale.&lt;br /&gt;
&lt;br /&gt;
n! = 1 *2 * 3 * 4 * 5...* n&lt;br /&gt;
&lt;br /&gt;
Putem observa ca in sirul celor n numere vom avea din k in k cate un numar divizibil cu k, printre acestea sunt si numere divizibile cu k^2 (k la puterea a doua ), pentru care mai trebuie sa numaram cate un k pentru fiecare.&lt;br /&gt;
Cate numere sunt divizibile cu k pana la n? R: n/k&lt;br /&gt;
Dar cate numere sunt divizibile cu k * k pana la n ?  k^2 / n&lt;br /&gt;
Cati de k vom avea in aceste numere? k + k^2 / n (caten umere divizibile cu k si cate numere divizibile cu k^2)&lt;br /&gt;
Extindem aceasta idee gandindu-ne ca pana la n mai putem avea si numere divizibile cu k^3, k^4, astfel va trebui sa numaram si pentru acestea cate un k. Rezulta formula:&lt;br /&gt;
&lt;br /&gt;
exp = n/k + n/k^2 +.... + n/k^p, unde k^p &amp;lt;= n, altfel fractia ar deveni 0&lt;br /&gt;
&lt;br /&gt;
Aplicatie:[https://www.varena.ro/problema/exponent exponent]Se dă un număr natural n şi o cifră k din mulţimea {2, 3, 5, 7}. Se cere să se afişeze exponentul lui k în descompunerea în factori primi a produsului 1·2·3·...·n.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;	&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin (&amp;quot;exponent.in&amp;quot;);&lt;br /&gt;
ofstream fout (&amp;quot;exponent.out&amp;quot;);&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, k, p, s;&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;&lt;br /&gt;
  p = k;&lt;br /&gt;
  s = 0;&lt;br /&gt;
  while ( n / p ){&lt;br /&gt;
    s += n / p;&lt;br /&gt;
    p *= k;&lt;br /&gt;
  }&lt;br /&gt;
  fout &amp;lt;&amp;lt; s;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Numarul de divizori ai unui numar ==&lt;br /&gt;
Fie &amp;lt;math&amp;gt;n = d_1^{p_1} * d_2^{p_2}*\cdots *d_k^{p_k}&amp;lt;/math&amp;gt; este descompunerea în factori primi a lui n. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;math &amp;gt;Nrdiv = (p_{1}+1)*(p_{2}+1)*...*(p_{k}+1) &amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Suma divizorilor unui numar == &lt;br /&gt;
&amp;lt;math&amp;gt;S = \dfrac{d_{1}^{p_{1}+1}-1}{d_{1}-1}*\dfrac{d_{2}^{p_{2}+1}-1}{d_{2}-1}*...*\dfrac{d_{k}^{p_{k}+1}-1}{d_{k}-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aplicati formula in problema: [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1574 Prietene]&lt;br /&gt;
Tema:[https://infoarena.ro/problema/sumdiv sumdiv]&lt;br /&gt;
&lt;br /&gt;
== Numarul de numere prime cu n mai mici ca n (Indicatorul lui Euler) ==&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1908 Fractii_ired]&lt;br /&gt;
Problema cere de fapt, cate numere din intervalul [1,n] sunt prime cu n. O prima solutie este sa calculam cmmdc dintre n si fiecare numar x din intervalul [1,n]. Daca cmmdc(x, n) este 1, atunci x/n e fractie ireductibila. Aceasta solutie insa este lenta, parcurgerea tuturor valorilor de la 1 la n consuma f. mult timp.&lt;br /&gt;
O alta solutie este data de [https://ro.wikipedia.org/wiki/Indicatorul_lui_Euler Indicatorul lui Euler]&lt;br /&gt;
Indicatorul lui Euler se determina folosind tot descompunerea in factori primi, calculand formula:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\phi(n)= (p_{1}-1)p_{1}^{k_{1}-1} * (p_{2}-1)p_{2}^{k_{2}-1}* \cdots *(p_{r}-1)p_{r}^{k_{r}-1}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Formula se poate reduce astfel incat algoritmul sa poata fi mai usor implementat :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\phi(n)=n * \dfrac{(p_{1}-1)}{p_{1}} * \dfrac{(p_{2}-1)}{p_{2}}* \cdots * \dfrac{(p_{r}-1)}{p_{r}}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tema ==&lt;br /&gt;
Filtrare probleme cu descompunerea in factori primi: [https://www.pbinfo.ro/?pagina=probleme-lista&amp;amp;disciplina=0&amp;amp;clasa=9&amp;amp;tag=1&amp;amp;subtag=18&amp;amp;dificultate=0&amp;amp;folosesc_consola=-1&amp;amp;eticheta=55,&amp;amp;start=0 Probleme Pbinfo]&lt;br /&gt;
===Teorie ===&lt;br /&gt;
Descompunerea in factori primi:&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=62 Factorizare] in curs&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/1319/descompunere-factori descompunere-factori] teorie&lt;br /&gt;
&lt;br /&gt;
=== Tema Laborator ===&lt;br /&gt;
&#039;&#039;&#039;Descompunerea in factori primi&#039;&#039;&#039;:&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=63 Factorizare1]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/435/factoriprimi Factoriprimi]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=268 Divk] &lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1319 Descompunere_factori]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/389/divizoripariinterval divizoripariinterval]&lt;br /&gt;
(dificile)&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/664/nrperechi nrperechi] produs cartezian de perechi&lt;br /&gt;
Alte:&lt;br /&gt;
* https://www.varena.ro/problema/exponent&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Codeforces&#039;&#039;&#039;&lt;br /&gt;
* [https://codeforces.com/contest/797/problem/A  A - k-Factorization] descompunere in factor primi&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_9&amp;diff=18283</id>
		<title>Clasa a IX-a lecția 9</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_9&amp;diff=18283"/>
		<updated>2023-03-14T20:39:30Z</updated>

		<summary type="html">&lt;p&gt;Bella: Created page with &amp;quot;== Algoritmul lui Euclid - cmmdc / cmmmc == [http://ro.wikipedia.org/wiki/Algoritmul_lui_Euclid Algoritmul lui Euclid] este o metodă eficientă de calcul al celui mai mare di...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Algoritmul lui Euclid - cmmdc / cmmmc ==&lt;br /&gt;
[http://ro.wikipedia.org/wiki/Algoritmul_lui_Euclid Algoritmul lui Euclid] este o metodă eficientă de calcul al celui mai mare divizor comun (&amp;lt;tt&amp;gt;CMMDC&amp;lt;/tt&amp;gt;). El este denumit după matematicianul grec Euclid, care l-a inventat. Un avantaj important al algoritmului lui Euclid este că el poate găsi &amp;lt;tt&amp;gt;CMMDC&amp;lt;/tt&amp;gt; eficient fără să trebuiască să calculeze factorii primi ai numerelor.&lt;br /&gt;
&lt;br /&gt;
Euclid a observat că &amp;lt;tt&amp;gt;CMMDC&amp;lt;/tt&amp;gt; al două numere &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; și &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; rămîne același dacă se scade numărul mai mic din cel mai mare (demonstrați!). Presupunînd că &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; este numărul mai mare, scăzînd în mod repetat pe &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; din &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;, în &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; va rămîne restul împărțirii lui &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; la &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;. Rezultă că &amp;lt;tt&amp;gt;CMMDC(a, b)&amp;lt;/tt&amp;gt; este totuna cu &amp;lt;tt&amp;gt;CMMDC(b, a % b)&amp;lt;/tt&amp;gt;. Algoritmul care rezultă este următorul: luăm restul împărțirii lui &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; la &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;, apoi restul împărțirii lui &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; la rest, și așa mai departe, pînă ce obținem un rest zero. &amp;lt;tt&amp;gt;CMMDC&amp;lt;/tt&amp;gt; este numărul rămas, cel diferit de zero.&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
Să calculăm &amp;lt;tt&amp;gt;CMMDC(252, 105)&amp;lt;/tt&amp;gt;. Calculăm &amp;lt;tt&amp;gt;252 % 105 = 42&amp;lt;/tt&amp;gt;. De aceea va trebui să calculăm &amp;lt;tt&amp;gt;CMMDC(105, 42)&amp;lt;/tt&amp;gt;. În continuare calculăm &amp;lt;tt&amp;gt;105 % 42 = 21&amp;lt;/tt&amp;gt;. Deci, vom calcula &amp;lt;tt&amp;gt;CMMDC(42, 21)&amp;lt;/tt&amp;gt;. Calculăm &amp;lt;tt&amp;gt;42 % 21 = 0&amp;lt;/tt&amp;gt;. Deoarece restul este zero &amp;lt;tt&amp;gt;CMMDC&amp;lt;/tt&amp;gt; va fi ultimul număr nenul, adica &amp;lt;tt&amp;gt;21&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
====Algoritmul ce foloseste structura &#039;&#039;while do&#039;&#039;====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
!Pseudocod&lt;br /&gt;
!C&lt;br /&gt;
!C++&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
 citeste a,b;&lt;br /&gt;
 while( b &amp;lt;&amp;gt; 0 )&lt;br /&gt;
  r ← a mod b;&lt;br /&gt;
  a ← b;&lt;br /&gt;
  b ← r;&lt;br /&gt;
 scrie a&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
int a,b,r;&lt;br /&gt;
scanf(&amp;quot;%d%d&amp;quot;,&amp;amp;a,&amp;amp;b);&lt;br /&gt;
while( b &amp;gt; 0){&lt;br /&gt;
 r = a % b;&lt;br /&gt;
 a = b;&lt;br /&gt;
 b = r;&lt;br /&gt;
}&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, a);&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
int a,b,r;&lt;br /&gt;
cin&amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;&lt;br /&gt;
while( b &amp;gt; 0 ){&lt;br /&gt;
 r = a % b;&lt;br /&gt;
 a = b;&lt;br /&gt;
 b = r;&lt;br /&gt;
}&lt;br /&gt;
cout &amp;lt;&amp;lt; a;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====Algoritmul ce foloseste structura &#039;&#039;do while&#039;&#039;====&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
!Pseudocod&lt;br /&gt;
!C&lt;br /&gt;
!C++&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
citeste a, b;&lt;br /&gt;
daca ( b &amp;gt; 0 ) atunci&lt;br /&gt;
  executa&lt;br /&gt;
    r ← a mod b;&lt;br /&gt;
    a ← b;&lt;br /&gt;
    b ← r;&lt;br /&gt;
  cat_timp( r &amp;lt;&amp;gt; 0 )&lt;br /&gt;
scrie a&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
int a, b, r;&lt;br /&gt;
scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;a, &amp;amp;b );&lt;br /&gt;
if( b &amp;gt; 0)&lt;br /&gt;
  do{&lt;br /&gt;
    r = a % b;&lt;br /&gt;
    a = b;&lt;br /&gt;
    b = r;&lt;br /&gt;
  }while( r != 0 );&lt;br /&gt;
printf( &amp;quot;%d&amp;quot;, a );&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
int a, b, r;&lt;br /&gt;
cin&amp;gt;&amp;gt; a &amp;gt;&amp;gt; b;&lt;br /&gt;
if( b &amp;gt; 0)       &lt;br /&gt;
  do{&lt;br /&gt;
    r = a % b;&lt;br /&gt;
    a = b;&lt;br /&gt;
    b = r;&lt;br /&gt;
  }while( r != 0 );&lt;br /&gt;
cout &amp;lt;&amp;lt; a;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
Observatie: Atentie, daca b poate fi si 0, trebuie sa testam valoarea acestuia inainte de intrarea i nstructura repetitiva.&lt;br /&gt;
&#039;&#039;&#039;Aplicatie&#039;&#039;&#039;: &lt;br /&gt;
Doi prieteni, un iepure și o broscuță joacă un joc: pornesc de la o linie de start și încep să sară. Broasca sare &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; centimetri, iar iepurele &amp;lt;tt&amp;gt;m&amp;lt;/tt&amp;gt; centimetri. Cine este mai în spate vine la rînd să sară. Jocul se termină atunci cînd iepurele și broasca sînt iarăși la egalitate. Cîți centimetri au parcurs cei doi prieteni?&lt;br /&gt;
&lt;br /&gt;
[[Image:cmmmc.gif|frame|none|Săriturile broscuței și iepurelui]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Răspuns&#039;&#039;&#039;: după cum se vede și din figură, broscuța și iepurele vor sări o lungime egală cu &amp;lt;tt&amp;gt;CMMMC(m, n)&amp;lt;/tt&amp;gt;. Precum știm&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;CMMMC(m, n) = m ∙ n / CMMDC(m, n)&amp;lt;/pre&amp;gt;.&lt;br /&gt;
= Tema =&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=378 pavare] teorie&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=410 cmmdc2]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2771,Covorul Covorul]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/61/afisaredivizoricomuni afisaredivizoricomuni]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=9_2019&amp;diff=18282</id>
		<title>9 2019</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=9_2019&amp;diff=18282"/>
		<updated>2023-03-14T20:38:48Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Lectii */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Note de curs clasa a 9-a, prof. Isabela Coman  ==&lt;br /&gt;
=== Programa Scolara ===&lt;br /&gt;
* [http://lbi.ro/~bella/9/00_Programa_scolara/Programa_scolara_de_informatica_IX.pdf Programa Scolara clasa a 9-a INFORMATICA NEINTENSIV]&lt;br /&gt;
* [http://lbi.ro/~bella/9/00_Programa_scolara/Programa_scolara_de_informatica_IX.pdf Programa Scolara clasa a 9-a INFORMATICA INTENSIV]&lt;br /&gt;
=== Lectii ===&lt;br /&gt;
* [[Clasa a IX-a lecția 1]] - Informatica ca stiinta; Rolul Informaticii in societate; Studii de caz&lt;br /&gt;
* [[Clasa a IX-a lecția 2]] - Notiunea de algoritm; Proprietatile algoritmului; Etapele de rezolvarii unei probleme&lt;br /&gt;
* [[Clasa a IX-a lecția 3]] - Date; Operatori; Expresii; Reprezentarea algoritmilor; Elemente de baza ale limbajului de programare &lt;br /&gt;
* [[Clasa a IX-a lecția 4]] - Principiile programarii structurate; Structuri de control; Structura secventiala; structura alternativa; &lt;br /&gt;
* [[Clasa a IX-a lecția 5]] - Structura repetitiva; While-do; Aplicatii &lt;br /&gt;
* [[Clasa a IX-a lecția 6]] - Cifrele unui numar &lt;br /&gt;
    * [[ Test Cifre ]] Test Cifrele unui numar; &lt;br /&gt;
* [[Clasa a IX-a lecția 7]] - Divizorii unui numar; primalitate; divizori primi; &lt;br /&gt;
* [[Clasa a IX-a lecția 8]] - Descompunere in factori primi, Euclid&lt;br /&gt;
* [[Clasa a IX-a lecția 9]] - cmmdc; cmmmc (EUCLID) &lt;br /&gt;
    * [[ Test Divizibilitate ]] Test Divizibilitate&lt;br /&gt;
* [[Clasa a IX-a lecția 10]] - Structura repetitiva for; Fibonacci; Secvente simple&lt;br /&gt;
* [[Clasa a IX-a lecția 11]] - Secvente ( secvente la care este necesara pastrarea mai multor termeni ); Monotonie&lt;br /&gt;
* [[Clasa a IX-a lecția 12]] - Aplicatii cu secvente - Recapitulare pentru teza&lt;br /&gt;
    * [[Clasa a IX-a lecția 13]] - Teza&lt;br /&gt;
* [[Clasa a IX-a lecția 14]] - Numere reale; Tipul char; &lt;br /&gt;
* [[Clasa a IX-a lecția 15]] - &#039;&#039;&#039;Vectori&#039;&#039;&#039;: Citire, Scriere, Initializare, Maxim, Cautare ; &#039;&#039;&#039;Vectori de frecventa&#039;&#039;&#039; &lt;br /&gt;
* [[Clasa a IX-a lecția 16]] - Parcurgerea circulara a unui vector&lt;br /&gt;
* [[Clasa a IX-a lecția 17]] - &#039;&#039;&#039;Operatii cu vectori&#039;&#039;&#039;: Inserare, Stergere, Rotire, Rasturnare, Compactare ( mutare zerouri la coada )&lt;br /&gt;
* [[Clasa a IX-a lecția 18]] - Fisiere text &lt;br /&gt;
* [[Clasa a IX-a lecția 19]] - Vectori; Citire, Scriere, Initializare, Maxim, Cautare; Parcurgerea vectorilor&lt;br /&gt;
* [[Clasa a IX-a lecția 20]] - &lt;br /&gt;
* [[Optional numere mari]] - Numere mari - pentru olimpiada&lt;br /&gt;
* [[Clasa a IX-a lecția 21]] - Operatii cu multimi; Cautare binara; NU s-a facut scoala&lt;br /&gt;
* [[Clasa a IX-a lecția 22]] - Baze de numeratie&lt;br /&gt;
* [[Clasa a IX-a lecția 23]] - Secvente; &lt;br /&gt;
* [[Clasa a IX-a lecția 24]] - Cautare binara&lt;br /&gt;
* [[Clasa a IX-a lecția 25]] - 26-30 mar - Ciurul Lui Eratostene;&lt;br /&gt;
* [[Clasa a IX-a lecția 26]] - 09-13 apr - Metode de sortare; &lt;br /&gt;
* [[Clasa a IX-a lecția 27]] - 16-20 apr - Interclasare&lt;br /&gt;
* [[Clasa a IX-a lecția 28]] - Matrice: Citire, Scriere, Cautare; Matrice nepatratice &lt;br /&gt;
* [[Clasa a IX-a lecția 29]] - Matrice nepatratice&lt;br /&gt;
* [[Clasa a IX-a lecția 30]] - Teza; Corectare Teza &lt;br /&gt;
* [[Clasa a IX-a lecția 31]] - Matrice patratice -15 mai&lt;br /&gt;
* [[Clasa a IX-a lecția 32]] - Matrice patratice continuare&lt;br /&gt;
* [[Clasa a IX-a lecția 33]] - &lt;br /&gt;
* [[Clasa a IX-a lecția 34]] -&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Isa&amp;diff=18278</id>
		<title>Isa</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Isa&amp;diff=18278"/>
		<updated>2023-02-22T19:53:50Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;2018-2019&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/Cerc_6_2018 Clasa a 6-a]&lt;br /&gt;
&lt;br /&gt;
Resurse pentru clasa&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/tmp_6 tmp_6] Link pt clasa a 6-a&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/tmp_6_2 tmp_6_2] Link pt clasa a 6-a&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/tmp_cerc_6 tmp_cerc_6] cerc lectie curent&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/tmp_david10 tmp_david10] cerc lectie in lucru&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/tmp_isa tmp_isa]&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/5_2017 Clasa a 5-a]&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/6_2018 Clasa a 6-a]&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/Clasa_a_VII-a_isa Clasa a 7-a] &lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/Clasa_a_VIII-a_isa Clasa a 8-a]&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/5_2017 Clasa a 9-a]&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/10 Clasa a 10-a]&lt;br /&gt;
Pagini temp pentru constructie lectii&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/Clasa_a_6-a_TEMP cerc 6]&lt;br /&gt;
* [http://algopedia.ro/wiki/index.php/Clasa_a_7-a_TEMP cerc 7]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Tmp_david10&amp;diff=18277</id>
		<title>Tmp david10</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Tmp_david10&amp;diff=18277"/>
		<updated>2023-02-22T19:53:20Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_10&amp;diff=18276</id>
		<title>Clasa a XI-a lecția 10</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_10&amp;diff=18276"/>
		<updated>2023-02-22T19:20:20Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_9&amp;diff=18275</id>
		<title>Clasa a XI-a lecția 9</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_9&amp;diff=18275"/>
		<updated>2023-02-22T19:19:46Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_7&amp;diff=18274</id>
		<title>Clasa a XI-a lecția 7</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_7&amp;diff=18274"/>
		<updated>2023-02-22T19:18:31Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_4&amp;diff=18273</id>
		<title>Clasa a XI-a lecția 4</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_4&amp;diff=18273"/>
		<updated>2023-02-22T19:17:02Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_3&amp;diff=18272</id>
		<title>Clasa a XI-a lecția 3</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_3&amp;diff=18272"/>
		<updated>2023-02-22T19:16:42Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_2&amp;diff=18271</id>
		<title>Clasa a XI-a lecția 2</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_2&amp;diff=18271"/>
		<updated>2023-02-22T19:15:49Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_V-a_lec%C8%9Bia_6_S21&amp;diff=18270</id>
		<title>Clasa a V-a lecția 6 S21</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_V-a_lec%C8%9Bia_6_S21&amp;diff=18270"/>
		<updated>2023-02-08T07:41:29Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lectie = &lt;br /&gt;
* [http://varena.ro/problema/ore ore] 	.campion 2011&lt;br /&gt;
Se citeste o ora de forma : hhmm ( un numar de 4 cifre ). Sa se afisez cea mai mica si cea mai mare ora ce se pot forma cu cifrele orei citite.&lt;br /&gt;
&lt;br /&gt;
* [http://varena.ro/problema/minute minute]&lt;br /&gt;
Se citeste o ora de forma : h m; Sa se precizeze cat indica ceasul dupa h1 ore m1 minute, stiind ca la fiecare suprapunere a limbi mari cu cea mica ceasul sta 5 minute.&lt;br /&gt;
&lt;br /&gt;
* [http://varena.ro/problema/minute1 minute1]&lt;br /&gt;
Aceasi problema minute cu limitele modificare, pentru o rezolvare optima&lt;br /&gt;
&lt;br /&gt;
* [http://varena.ro/problema/date date]&lt;br /&gt;
* [http://varena.ro/problema/consiliu consiliu]&lt;br /&gt;
&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1084 tren] OJI 2010, clasa a 5 a&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_7&amp;diff=18263</id>
		<title>Clasa a IX-a lecția 7</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_7&amp;diff=18263"/>
		<updated>2022-11-21T18:48:10Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note de curs: prof. Isabela Coman&#039;&#039;&#039;&lt;br /&gt;
=Lectie=&lt;br /&gt;
== Afisarea divizorilor unui numar in ordine crescatoare ==&lt;br /&gt;
Fie un numar n natural. Sa se afiseze divizorii acestuia in ordine crescatoare.&lt;br /&gt;
==== Varianta1 ====&lt;br /&gt;
Aceasta varianta propune verificarea tuturor numerelelor de la 1 la n si afisarea doar a celor ce divid numarul n.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocod&#039;&#039;&#039;&lt;br /&gt;
  intreg n, d&lt;br /&gt;
  citeste n&lt;br /&gt;
  d = 1&lt;br /&gt;
  cat_timp( d &amp;lt;= n )&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      scrie d, &amp;quot; &amp;quot;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d &amp;lt;= n ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      printf(&amp;quot;%d &amp;quot;, d);&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;C++&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d &amp;lt;= n ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Varianta2 optima ====&lt;br /&gt;
Stim ca toti divizorii unui numar de pana in radicalul sau au ca si divizor corespondent un divizor de dupa radical si anume, presupunand un d ca divizor de pana in radical, n/d este perechea sa de dupa radical.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocod&#039;&#039;&#039;&lt;br /&gt;
  intreg n, d&lt;br /&gt;
  citeste n&lt;br /&gt;
  d = 1&lt;br /&gt;
  cat_timp( d &amp;lt; sqrt( n ) )          //sqrt(n) se considera parte intreaga &lt;br /&gt;
    if( n mod d == 0 )&lt;br /&gt;
      scrie d, &amp;quot; &amp;quot;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  d = sqrt( n )&lt;br /&gt;
  cat_timp( d &amp;gt;= 1 )          //sqrt(n) se considera parte intreaga &lt;br /&gt;
    if( n mod d == 0 )&lt;br /&gt;
      scrie n / d, &amp;quot; &amp;quot;&lt;br /&gt;
    d = d - 1;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
  // afisam mai intai divizorii de pana in radical&lt;br /&gt;
  // vom parcurge deci sqrt(n) numere&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      printf(&amp;quot;%d\n&amp;quot;, d);&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  // afisam divizorii de dupa radical&lt;br /&gt;
  // parcurgem divizorii de pana in radical in ordine inversa&lt;br /&gt;
  // si afisam perechea fiecaruia de dupa radical&lt;br /&gt;
  // vom parcurge deci tot sqrt(n) numere&lt;br /&gt;
  d = sqrt (n);&lt;br /&gt;
  while( d &amp;gt;= 1 ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      printf(&amp;quot;%d\n&amp;quot;, n/d);&lt;br /&gt;
    d = d - 1;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  // afisam mai intai divizorii de pana in radical&lt;br /&gt;
  // vom parcurge deci sqrt(n) numere&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  // afisam divizorii de dupa radical&lt;br /&gt;
  // parcurgem divizorii de pana in radical in ordine inversa&lt;br /&gt;
  // si afisam perechea fiecaruia de dupa radical&lt;br /&gt;
  // vom parcurge deci tot sqrt(n) numere&lt;br /&gt;
  d = sqrt (n);&lt;br /&gt;
  while( d &amp;gt;= 1 ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; n / d &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    d = d - 1;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// fara sqrt&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  // afisam mai intai divizorii de pana in radical&lt;br /&gt;
  // vom parcurge deci sqrt(n) numere&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  // afisam divizorii de dupa radical&lt;br /&gt;
  // parcurgem divizorii de pana in radical in ordine inversa&lt;br /&gt;
  // si afisam perechea fiecaruia de dupa radical&lt;br /&gt;
  // vom parcurge deci tot sqrt(n) numere&lt;br /&gt;
  &lt;br /&gt;
  if ( d * d &amp;gt; n )   // daca am depasit radicalul, scadem 1 din d&lt;br /&gt;
    d --;&lt;br /&gt;
  while( d &amp;gt;= 1 ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; n / d &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    d = d - 1;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Suma divizorilor unui numar ==&lt;br /&gt;
Varianta1:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, d, s;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  printf( &amp;quot;Divizorii lui %d sunt:&amp;quot;, n );&lt;br /&gt;
 &lt;br /&gt;
  s = 0;&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while ( d &amp;lt;= n ) {&lt;br /&gt;
    if ( n % d == 0 )&lt;br /&gt;
      s = s + d;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, s );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Varianta2 optimizat:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n, s, d;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%lld&amp;quot;, &amp;amp;n);&lt;br /&gt;
  s = 0;&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){      // ne oprim cu d pana in radicalul numarului n&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      s = s + d + n / d;   // adaugam la suma si pe d si perechea sa de dupa radical&lt;br /&gt;
    d = d + 1;    &lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // aici d va fi fie egal cu radical din n daca n e patrat perfect, fie mai mare decat radical din n&lt;br /&gt;
&lt;br /&gt;
  if( d * d == n )         // daca n e patrat perfect, &lt;br /&gt;
    s = s + d;             // vom adauga radical din n doar o data la suma&lt;br /&gt;
  printf(&amp;quot;%lld\n&amp;quot;, s);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Primalitate ==&lt;br /&gt;
Fie un numar n. Sa se afiseze mesajul &amp;quot;DA&amp;quot; daca numarul este prim si mesajul &amp;quot;NU&amp;quot; in caz contrar.&lt;br /&gt;
Rezolvare: Vom cauta un divizor al numarului n parcurgand toate numerele de la 2 pana la radical din n. Daca nu vom gasi nici un divizor, atunci numarul este prim.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
 int n, d;&lt;br /&gt;
 scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
 d = 2;&lt;br /&gt;
 while ( d * d &amp;lt;= n &amp;amp;&amp;amp; n % d &amp;gt; 0 )&lt;br /&gt;
   d = d + 1;&lt;br /&gt;
 if ( d * d &amp;gt; n &amp;amp;&amp;amp; n &amp;gt; 1 )&lt;br /&gt;
   printf( &amp;quot;DA&amp;quot; );&lt;br /&gt;
 else&lt;br /&gt;
   printf( &amp;quot;NU&amp;quot; );&lt;br /&gt;
 return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Divizori primi==&lt;br /&gt;
Sa se afiseze cati divizori primi are un număr n?&lt;br /&gt;
Tendinta multora cand e vorba de aceasta problema este de a pcuarcurge toti divizorii si de a-i verifica pe fiecare in parte daca este prim. Vom invata in lectia urmatoare cum descompunem in factori primi un numar.&lt;br /&gt;
&lt;br /&gt;
= Laborator = &lt;br /&gt;
==Divizorii unui numar==&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=376 Suma Divizori] teorie====&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=387 Suma divizori impari]====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n, s, d;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%lld&amp;quot;, &amp;amp;n);&lt;br /&gt;
  s = 0;&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){&lt;br /&gt;
    if( n % d == 0 ){&lt;br /&gt;
      if( d % 2 ){&lt;br /&gt;
        s = s + d; //printf(&amp;quot;%lld\n&amp;quot;, d);&lt;br /&gt;
      }&lt;br /&gt;
      if( n / d % 2 ){&lt;br /&gt;
        s = s + n / d; //printf(&amp;quot;%lld\n&amp;quot;, n/d);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  if( d * d == n &amp;amp;&amp;amp; d % 2 )&lt;br /&gt;
    s = s + d;&lt;br /&gt;
  printf(&amp;quot;%lld\n&amp;quot;, s);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=388 Numarul divizorilor Pari]====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n, c, d;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%lld&amp;quot;, &amp;amp;n);&lt;br /&gt;
  c = 0;&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){&lt;br /&gt;
    if( n % d == 0 ){&lt;br /&gt;
      if( d % 2 == 0){&lt;br /&gt;
        c = c + 1; //printf(&amp;quot;%d\n&amp;quot;, d);&lt;br /&gt;
      }&lt;br /&gt;
      if( n / d % 2 == 0){&lt;br /&gt;
        c = c + 1; //printf(&amp;quot;%d\n&amp;quot;, n/d);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  if( d * d == n &amp;amp;&amp;amp; d % 2 == 0 )&lt;br /&gt;
    c = c + 1;&lt;br /&gt;
  printf(&amp;quot;%lld\n&amp;quot;, c);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=61 AfisareDivizoriComuni]====&lt;br /&gt;
Să se scrie un program care afișează divizorii comuni ai două numere naturale citite de la tastatură.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;math.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int a, b, d;&lt;br /&gt;
&lt;br /&gt;
  scanf( &amp;quot;%ld%d&amp;quot;, &amp;amp;a, &amp;amp;b );&lt;br /&gt;
  // pun in a valoarea cea mai mica dintre a si b&lt;br /&gt;
  if ( a &amp;gt; b ){&lt;br /&gt;
    d = a;&lt;br /&gt;
    a = b;&lt;br /&gt;
    b = d;&lt;br /&gt;
  }&lt;br /&gt;
  // parcurg toti divizorii d ai lui a de pana in radical&lt;br /&gt;
  // si ma intreb daca sunt si divizori ai lui b&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; a ){&lt;br /&gt;
    if ( a % d == 0 &amp;amp;&amp;amp; b % d == 0 )&lt;br /&gt;
        printf( &amp;quot;%d &amp;quot;, d ) ;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  // parcurg toti divizorii d ai lui a de pana in radical, &lt;br /&gt;
  // daca d e divizor al lui a si n/d e divizor al lui a&lt;br /&gt;
  // verific daca n/d este si divizori ai lui b&lt;br /&gt;
  d = sqrt ( a );&lt;br /&gt;
  while( d * d &amp;gt;= 1 ){&lt;br /&gt;
    if ( a % d == 0 &amp;amp;&amp;amp; b % ( a / d ) == 0 )&lt;br /&gt;
        printf( &amp;quot;%d &amp;quot;, a / d ) ;&lt;br /&gt;
    d = d - 1;&lt;br /&gt;
  }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Laborator = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== TEMA ==&lt;br /&gt;
=== Tema teorie ===&lt;br /&gt;
Usoare&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=408 Divizorii Oglinditului]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=64 NumarPerfect]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=445 PseudoPerfect]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=373 nPrime]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=detalii-evaluare&amp;amp;id=6301021 DivizoriPariInterval]&lt;br /&gt;
Medii&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2745 intrebari] numarul de divizori&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1574 Prietene] ( suma divizori )&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=245 NrDivMax]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=380 aprim1]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=381 aprim2]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=374 nprime1]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Test_Cifre&amp;diff=18262</id>
		<title>Test Cifre</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Test_Cifre&amp;diff=18262"/>
		<updated>2022-11-09T19:55:03Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* cifra1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Test  == &lt;br /&gt;
===[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=464 Cifrek]===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, k, c;&lt;br /&gt;
    cin &amp;gt;&amp;gt; k;               // citim valoarea cifrei k&lt;br /&gt;
    c = 0;                  // c retine cate cifre k vom gasi in numerele citite&lt;br /&gt;
    cin &amp;gt;&amp;gt; n;               // citim primul numar din sir&lt;br /&gt;
    while( n != 0 ) {       // cata vreme numarul citit n este nenul&lt;br /&gt;
      if( n % 2 == 0 )      // daca numarul este par&lt;br /&gt;
        while( n &amp;gt; 0 ) {    // cata vreme avem cifre in n&lt;br /&gt;
          if( k == n % 10 ) // daca ultima cifra a lui n este k&lt;br /&gt;
            c ++;           // crestem contorul cu 1&lt;br /&gt;
          n = n / 10;       // scoatem ultima cifra din n&lt;br /&gt;
        }&lt;br /&gt;
      cin &amp;gt;&amp;gt; n;             // citim urmatorul numar din sir&lt;br /&gt;
    }&lt;br /&gt;
    cout &amp;lt;&amp;lt; c;              // afisam contorul&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n, k, c;&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;k );&lt;br /&gt;
    c = 0;&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
    while( n &amp;gt; 0 ) {&lt;br /&gt;
      if( n % 2 == 0 ) &lt;br /&gt;
        while( n &amp;gt; 0 ) {&lt;br /&gt;
          if( k == n % 10 )&lt;br /&gt;
            c ++;&lt;br /&gt;
          n = n / 10;&lt;br /&gt;
        }&lt;br /&gt;
      scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
    }&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, c );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=367 Eliminare Cifre]===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, nr, sum, nou, ucif, p;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;                          // citim n ( numarul de numere din sir&lt;br /&gt;
  sum = 0;                           // suma numerelor din sir, dupa eliminarea aparitiilor ultimei cifre&lt;br /&gt;
  i = 0;                             // i reprezinta aici pozitia fiecarui numar citit ( numerotam numerele pornind de la 0, ultima pozitie va fi n-1&lt;br /&gt;
  while ( i &amp;lt; n ){                   // cata vreme am citit mai putin de n numere&lt;br /&gt;
    cin &amp;gt;&amp;gt; nr;                       // citim numarul din sir de pe pozitia i&lt;br /&gt;
    ucif = nr % 10;                  // salvam in ucif ultima cifra a lui nr&lt;br /&gt;
    &lt;br /&gt;
    nou = 0;                          // construim un nou numar ce contine cifrele diferite de ultima cifra&lt;br /&gt;
    p = 1;                            // avem nevoie de o putere a lui 10, initial 1&lt;br /&gt;
    while ( nr &amp;gt; 0 ){                 // cata vreme am cifre in numar&lt;br /&gt;
      if ( nr % 10 != ucif ){         // daca ultima cifra e diferita de ucif&lt;br /&gt;
        nou = ( nr % 10 ) * p + nou;  // adaugam cifra la inceputul numarului nou&lt;br /&gt;
        p *= 10;                      // crestem puterea&lt;br /&gt;
      }&lt;br /&gt;
      nr /= 10;                       // scoatem din nr ultima cifra&lt;br /&gt;
    }    &lt;br /&gt;
    sum += nou;                       // adaugam numarul nou contruit la n    &lt;br /&gt;
    i++;                              // trecem la numarul urmator ( cu numarul de ordine i )&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  cout &amp;lt;&amp;lt; sum ;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, nr, sum, nou, ucif, p;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  sum = 0;&lt;br /&gt;
  i = 0;&lt;br /&gt;
  while ( i &amp;lt; n ){&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;nr );&lt;br /&gt;
    ucif = nr % 10;&lt;br /&gt;
    nr /= 10;&lt;br /&gt;
    nou = 0;&lt;br /&gt;
    p = 1;&lt;br /&gt;
    while ( nr &amp;gt; 0 ){&lt;br /&gt;
      if ( nr % 10 != ucif ){&lt;br /&gt;
        nou = nou + p * ( nr % 10 );&lt;br /&gt;
        p *= 10;&lt;br /&gt;
      }&lt;br /&gt;
      nr /= 10;&lt;br /&gt;
    }&lt;br /&gt;
    sum += nou;&lt;br /&gt;
  i++;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, sum );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=3077 suma_prefixe]===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  long long int n, s = 0;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    s = s + n;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; s;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=361 cifra1]===&lt;br /&gt;
Vom elimina pe rand cate o cifra, prima data ultima cifra, apoi penultima, in final prima cifra.&lt;br /&gt;
Vom imparti numarul in 2. Prima parte a numarului contine si cifra de eliminat, a doua parte contine restul cifrelor de dupa cifra de eliminat. Vom construi un nou numar alipind cele doua parti dupa ce eliminam din prima parte ultima cifra.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, max, nr, p;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n;&lt;br /&gt;
    p = 1;&lt;br /&gt;
    max = 0;&lt;br /&gt;
    while( p &amp;lt;= n ){&lt;br /&gt;
      nr = n / ( p * 10 ) * p + n % p; &lt;br /&gt;
      if( nr &amp;gt; max )&lt;br /&gt;
        max = nr;&lt;br /&gt;
      p = p * 10;&lt;br /&gt;
    }&lt;br /&gt;
    cout &amp;lt;&amp;lt; max;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, max, nr, p;&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
    p = 1;&lt;br /&gt;
    max = 0;&lt;br /&gt;
    while( p &amp;lt;= n ){&lt;br /&gt;
      nr = n / ( p * 10 ) * p + n % p; &lt;br /&gt;
      if( nr &amp;gt; max )&lt;br /&gt;
        max = nr;&lt;br /&gt;
      p = p * 10;&lt;br /&gt;
    }&lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, max );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2575 Schimb_cif]===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n, i, x, uc, p, inv;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  i = 1;&lt;br /&gt;
  while ( i &amp;lt;= n ){&lt;br /&gt;
    cin &amp;gt;&amp;gt; x;           // citim al i-lea numar&lt;br /&gt;
    uc = x % 10;        // pastram ultima cifra&lt;br /&gt;
    x = x / 10;         // taiem ultima cifra din numar&lt;br /&gt;
    inv = 0;            // determinam inversului numarului ramas, nu includem si prima cifra &lt;br /&gt;
    p = 1;              // p va avea atatea 0 -uri, cate cifre are mijlocul lui x&lt;br /&gt;
    while ( x &amp;gt; 9 ){    // cata vreme x are mai mult de o cifra&lt;br /&gt;
      inv = inv * 10 + x % 10;  // adaugam cifra la invers&lt;br /&gt;
      x = x / 10;               // taiem cifra din x&lt;br /&gt;
      p = p * 10;               // adaugam un 0 la puterea lui p&lt;br /&gt;
    }&lt;br /&gt;
    x = ( x * p + inv ) * 10 + uc;   // recompunem numarul alipind prima cifra ramasa in x, inv si ultima cifra&lt;br /&gt;
    cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    i ++;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_6&amp;diff=18255</id>
		<title>Clasa a IX-a lecția 6</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_6&amp;diff=18255"/>
		<updated>2022-10-18T18:07:32Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note de curs: prof. Isabela Coman&#039;&#039;&#039;&lt;br /&gt;
= Prelucrarea cifrelor unui numar  =&lt;br /&gt;
== Teorie ==&lt;br /&gt;
=== Prima cifra a unui numar ===&lt;br /&gt;
Se citește n. Să se afișeze prima cifra lui n.&lt;br /&gt;
&#039;&#039;&#039;Pseudocod&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  intreg n&lt;br /&gt;
  citeste n&lt;br /&gt;
  cat_timp ( n &amp;gt; 9 ) executa&lt;br /&gt;
    n = n div 10&lt;br /&gt;
  scrie n&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C/C++&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n;&lt;br /&gt;
&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  &lt;br /&gt;
  while ( n &amp;gt; 9 ) &lt;br /&gt;
    n = n / 10;&lt;br /&gt;
&lt;br /&gt;
  printf( &amp;quot;%d &amp;quot;, n );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main() {&lt;br /&gt;
  int n;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  &lt;br /&gt;
  while ( n &amp;gt; 9 ) &lt;br /&gt;
    n = n / 10;&lt;br /&gt;
&lt;br /&gt;
  cout &amp;lt;&amp;lt; n;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main() {&lt;br /&gt;
  int n;&lt;br /&gt;
  int p = 1000000000;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  while ( p &amp;gt; n )&lt;br /&gt;
    p = p / 10;&lt;br /&gt;
  cout &amp;lt;&amp;lt; n / p;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main() {&lt;br /&gt;
  int n;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  int p = 1;&lt;br /&gt;
  while ( p &amp;lt;= n )&lt;br /&gt;
    p = p * 10;&lt;br /&gt;
  p = p / 10;&lt;br /&gt;
  cout &amp;lt;&amp;lt; n / p;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afisare cifre in ordine inversa ===&lt;br /&gt;
Se citește n. Să se afișeze cifrele lui n în ordine inversă.&lt;br /&gt;
[[Image:sl-cifre-număr-invers.gif|frame|none|Afișare cifre număr în ordine inversă]]&lt;br /&gt;
&lt;br /&gt;
Acest algoritm de &#039;&#039;&#039;PARCURGERE&#039;&#039;&#039; a cifrelor unui numar, se va aplica problemelor care prelucreaza intr-un fel sau altul cifrele numarului respectiv.&lt;br /&gt;
Pentru a putea parcurge cifrele unui numar, accesam mai intai cifra care se poate extrage cel mai usor din numar, si anume ultima cifra (stim ca ultima cifra a oricarui numar este restul impartirii numarului respectiv la 10). Dupa ce am extras aceasta cifra si am afisat-o , eliminam aceasta cifra din numar, astfel incat, penultima cifra a numarul va deveni ultima cifra, si deci o vom putea extrage usor si pe aceasta, la pasul urmator.&lt;br /&gt;
==== Pseudocod ====&lt;br /&gt;
 intreg n&lt;br /&gt;
 Citeste n&lt;br /&gt;
 Cat_timp ( n &amp;gt; 0 ) executa&lt;br /&gt;
   scrie n mod 10&lt;br /&gt;
   n = n div 10&lt;br /&gt;
&lt;br /&gt;
====C:====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n;&lt;br /&gt;
  printf( &amp;quot;Dati un numar: &amp;quot; );&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  printf( &amp;quot;Cifrele in ordine inversa: &amp;quot; );&lt;br /&gt;
  while(n &amp;gt; 0){         &lt;br /&gt;
    printf( &amp;quot;%d&amp;quot;, n % 10 );&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C++:====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; n % 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Suma cifrelor unui numar ===&lt;br /&gt;
[[Image:sl-suma-cifre-n.gif|frame|none|Schemă logică]]&lt;br /&gt;
&lt;br /&gt;
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila ACUMULATOR (o vom denumi s, de la suma), variabila in care vom aduna pe rand valorile cifrelor accesate. Pe masura ce accesam o cifra a unui numar, adunam valoarea cifrei la valoarea anterioara a acumulatorului, care valoare, este initial 0. &lt;br /&gt;
Daca am fi dorit sa calculam produsul cifrelor unui numar, cat ar fi trebuit sa fie initial variabila acumulator?&lt;br /&gt;
&lt;br /&gt;
==== Pseudocod ====&lt;br /&gt;
 intreg n, s&lt;br /&gt;
 citeste n&lt;br /&gt;
 s = 0;&lt;br /&gt;
 cat_timp ( n &amp;gt; 0 ) executa&lt;br /&gt;
   s &amp;lt;- s + n mod 10&lt;br /&gt;
   n &amp;lt;- n div 10&lt;br /&gt;
 scrie s&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, s;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  s = 0;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    s= s + n % 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  printf(&amp;quot;%d&amp;quot;,s);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====C++:====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, s;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  s = 0;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    s = s + n % 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; s;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cate cifre are un numar ===&lt;br /&gt;
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila CONTOR , cu ajutorul caruia vom numara cifrele pe masura ce le vom parcurge. Vom parcurge cifrele numarului incepand cu ultima cifra , si pentru fiecare cifra accesata, vom mari valoarea contorului cu 1.&lt;br /&gt;
&lt;br /&gt;
==== Pseudocod ====&lt;br /&gt;
 intreg n, contor&lt;br /&gt;
 citeste n&lt;br /&gt;
 contor = 1&lt;br /&gt;
 cat_timp ( n &amp;gt; 9 ) executa&lt;br /&gt;
   contor = contor + 1&lt;br /&gt;
   n = n div 10&lt;br /&gt;
 scrie contor&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, contor;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  contor = 1;&lt;br /&gt;
  while( n &amp;gt; 9 ){&lt;br /&gt;
    contor = contor + 1; &lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, contor );&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== C++ ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, contor;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  contor = 0;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    contor = contor + 1; &lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
 cout &amp;lt;&amp;lt; contor;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Algoritmul de mai sus ne da raspunsul corect pentru n = 0?&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, contor;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  contor = 1;&lt;br /&gt;
  while( n &amp;gt; 9 ){&lt;br /&gt;
    contor = contor + 1; &lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
 cout &amp;lt;&amp;lt; contor;&lt;br /&gt;
return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cate cifre sunt egale cu o cifra k ===&lt;br /&gt;
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. De asemenea, vom avea nevoie sa numaram cifrele care indeplinesc conditia data, folosind o variabila contor. In plus, vom avea nevoie sa testam daca o anumita cifra indeplineste conditia ceruta, si numai daca conditia este adevarata sa marim valoarea contorului.&lt;br /&gt;
&lt;br /&gt;
==== Pseudocod ====&lt;br /&gt;
 contor &amp;lt;- 0;&lt;br /&gt;
 cat_timp( n &amp;gt; 0 ) executa&lt;br /&gt;
   daca ( n mod 10 = k ) atunci&lt;br /&gt;
     contor &amp;lt;- contor + 1&lt;br /&gt;
   n &amp;lt;- n div 10&lt;br /&gt;
 scrie contor&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, k, contor;&lt;br /&gt;
  scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;k);  &lt;br /&gt;
  if ( n == 0 &amp;amp;&amp;amp; k == 0 )&lt;br /&gt;
    contor = 1;&lt;br /&gt;
  else&lt;br /&gt;
    contor = 0;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    if( n % 10 == k )&lt;br /&gt;
      contor ++;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, contor );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;C++&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, k, contor;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;  &lt;br /&gt;
  if ( n == 0 &amp;amp;&amp;amp; k == 0 )&lt;br /&gt;
    contor = 1;&lt;br /&gt;
  else&lt;br /&gt;
    contor = 0;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    if( n % 10 == k )&lt;br /&gt;
      contor ++;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; contor;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sunt toate cifrele lui n pare? ===&lt;br /&gt;
Acest algoritm, se bazeaza pe algoritmul de parcurgere a cifrelor unui numar, descris anterior. Vom avea nevoie in plus, de o variabila STEAG (SEMN) , cu ajutorul caruia vom identifica daca numarul are o cifra care nu respecta conditia data. Vom parcurge toate cifrele numarului si de fiecare data cand vom gasi o cifra care nu respecta conditia( nu este para) vom seta valoarea steguletului pe 0 (codificare a raspunsului NU, nu este ok numarul). Initial valoarea steguletului va fi setata pe 1 (codificare a raspunsului DA; presupunem ca numarul are numai cifre pare, adica este ok)&lt;br /&gt;
Variabila cu rol de steag este gasit. &lt;br /&gt;
&lt;br /&gt;
==== Pseudocod ====&lt;br /&gt;
 gasit = 1;&lt;br /&gt;
 cat_timp( n &amp;gt; 0 ) executa&lt;br /&gt;
   daca( n mod 2 == 1 )&lt;br /&gt;
     gasit = 0&lt;br /&gt;
   n&amp;lt;-n div 10;&lt;br /&gt;
 daca ( gasit == 0 )&lt;br /&gt;
   scrie “nu sunt toate pare”&lt;br /&gt;
 altfel&lt;br /&gt;
   scrie “sunt toate pare”&lt;br /&gt;
&lt;br /&gt;
==== C ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  gasit = 0;             // pp ca numarul nu are cifre impare ( toate cifrele sunt pare )&lt;br /&gt;
  while( n &amp;gt; 0 &amp;amp;&amp;amp; gasit == 0 ) {&lt;br /&gt;
    if( n % 2 == 1 )     // dc am gasit o cifra impara&lt;br /&gt;
      gasit = 1;         // numarul are cifre impare&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  if( gasit == 1 )&lt;br /&gt;
    cout &amp;lt;&amp;lt; “nu sunt toate pare”;&lt;br /&gt;
  else&lt;br /&gt;
    cout &amp;lt;&amp;lt; “sunt toate pare”;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Varianta condensata:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;   &lt;br /&gt;
  while( n &amp;gt; 0 &amp;amp;&amp;amp; n % 2 == 0 )    // cat timp am cifre in n si ultima nu e impara&lt;br /&gt;
    n = n / 10;  &lt;br /&gt;
  if( n &amp;gt; 0 )&lt;br /&gt;
    printf(&amp;quot;nu sunt toate pare&amp;quot;);&lt;br /&gt;
  else&lt;br /&gt;
    printf(&amp;quot;sunt toate pare&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Afisare cifre de la stanga la dreapta ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  int p = 1000000000;&lt;br /&gt;
  while ( p &amp;gt; n )&lt;br /&gt;
    p = p / 10;&lt;br /&gt;
  while ( p &amp;gt; 0 ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; n / p &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    n = n % p;&lt;br /&gt;
    p = p / 10;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Cifra maxima ===&lt;br /&gt;
Se citeste un numar n, natural. Sa se afiseze cifra cea mai mare care apare in numarul n.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, cmax, f, nc;&lt;br /&gt;
  ///citim numarul n ca numar intreg&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  ///calculam cea mai mare cifra a sa&lt;br /&gt;
  cmax = n % 10;&lt;br /&gt;
  n = n / 10;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    if( n % 10 &amp;gt; cmax )&lt;br /&gt;
      cmax = n % 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
 &lt;br /&gt;
  printf( &amp;quot;%d\n&amp;quot;, cmax );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Cifra maxima si frecventa acestuia ===&lt;br /&gt;
* 1. Se citeste un numar n. Afisati cifra maxima si specificati de cate ori apare aceasta in numar.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, cmax, f, nc;&lt;br /&gt;
  ///citim numarul n ca numar intreg&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  nc = n;&lt;br /&gt;
  ///calculam cea mai mare cifra a sa&lt;br /&gt;
  cmax = n % 10;&lt;br /&gt;
  n = n / 10;&lt;br /&gt;
  while( n &amp;gt; 0 ){&lt;br /&gt;
    if( n % 10 &amp;gt; cmax )&lt;br /&gt;
      cmax = n % 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  ///calculam de cate ori apare cifra cmax in n&lt;br /&gt;
  f = 0;&lt;br /&gt;
  while( nc &amp;gt; 0 ){&lt;br /&gt;
    if( nc % 10 == cmax )&lt;br /&gt;
      f = f + 1;&lt;br /&gt;
    nc = nc / 10;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d %d\n&amp;quot;, cmax, f );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, cmax, f, uc;&lt;br /&gt;
&lt;br /&gt;
  ///citim numarul n ca numar intreg&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
&lt;br /&gt;
  ///calculam cea mai mare cifra a sa cmax, si de cate ori apare f&lt;br /&gt;
  cmax = n % 10;                // cifra maxima presupun a fi ultima cifra&lt;br /&gt;
  f = 1;                        // aceasta apare deocamdata odata&lt;br /&gt;
  n = n / 10;                   // scoatem din numar ultima cifra&lt;br /&gt;
  while ( n &amp;gt; 0 ){              // cata vreme am cifre in numar&lt;br /&gt;
    if ( n % 10 &amp;gt; cmax ){       // compar ultima cifra a numarului cu cifra maxima&lt;br /&gt;
      cmax = n % 10;            // daca e mai mare, modific valoarea din maxim&lt;br /&gt;
      f = 1;                    // noul maxim apare deocamdata o data&lt;br /&gt;
    }&lt;br /&gt;
    else if ( n % 10 == cmax )  // daca am gasit o val egala cu maximul&lt;br /&gt;
      f = f + 1;                // cresc frecventa maximului&lt;br /&gt;
    n = n / 10;                 // tai ultima cifra din n&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d %d\n&amp;quot;, cmax, f );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Inversul unui numar ===&lt;br /&gt;
[[Image:sl-rasturnat-n.gif|frame|none|Schemă logică]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Pseudocod&#039;&#039;&#039;&lt;br /&gt;
  intreg n, r;&lt;br /&gt;
  citeste n&lt;br /&gt;
  r = 0;&lt;br /&gt;
  cat_timp ( n &amp;gt; 0 ) executa&lt;br /&gt;
    r = r * 10 + n mod 10    &lt;br /&gt;
    n = n div 10&lt;br /&gt;
  scrie r&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  int n, r;&lt;br /&gt;
&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  r = 0;&lt;br /&gt;
  while ( n &amp;gt; 0 ) {&lt;br /&gt;
    r = r * 10 + n % 10;    &lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;Rasturnatul lui n este %d\n&amp;quot;, r );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Palindrom ===&lt;br /&gt;
Definiție: un număr palindrom (sau simetric) este un număr care este identic cu răsturnatul lui. Cu alte cuvinte el arată la fel dacă îi scriem cifrele de la stînga la dreapta sau de la dreapta la stînga. Exemple de numere palindrom sînt 1221, 5229225, 27272, 44, 1. Problemă: să se determine dacă un număr n este palindrom.&lt;br /&gt;
Rezolvare: vom calcula răsturnatul lui n în variabila r. Dacă cele două numere sînt egale înseamnă ca numărul este palindrom. Trebuie să acordăm atenție faptului că n va fi distrus în timpul calculului, drept pentru care îi vom face o copie în nc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, nc, r;&lt;br /&gt;
&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  nc = n;&lt;br /&gt;
  r = 0;&lt;br /&gt;
  while ( n &amp;gt; 0 ) {&lt;br /&gt;
    r = r * 10 + n % 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  if ( nc == r )&lt;br /&gt;
    printf( &amp;quot;%d este palindrom\n&amp;quot;, nc );&lt;br /&gt;
  else&lt;br /&gt;
    printf( &amp;quot;%d nu este palindrom\n&amp;quot;, nc );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Algoritmul clasic verifică dacă numărul este egal cu răsturnatul său:&lt;br /&gt;
Avem şi o metodă mai apropiată de cea originală, în care răsturnăm numărul numai pînă la jumate:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n, r;&lt;br /&gt;
  scanf(&amp;quot;%lld&amp;quot;, &amp;amp;n );&lt;br /&gt;
&lt;br /&gt;
  if ( n &amp;gt; 0 &amp;amp;&amp;amp; n % 10 == 0 )&lt;br /&gt;
    printf(&amp;quot;NU\n&amp;quot;);&lt;br /&gt;
  else {&lt;br /&gt;
    r = 0;&lt;br /&gt;
    while( n &amp;gt; r ){&lt;br /&gt;
      r = r * 10 + n % 10;&lt;br /&gt;
      n = n / 10;&lt;br /&gt;
    }&lt;br /&gt;
    // cand numarul are un numar par de cifre testam daca p == r&lt;br /&gt;
    // cand numarul are un numar impar de cifre testam daca p == r / 10&lt;br /&gt;
    if( n == r || n ==(r /10))&lt;br /&gt;
      printf(&amp;quot;DA\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      printf(&amp;quot;NU\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Metoda: Rasturnam numarul pana la jumatate; Cum obtinem cele 2 jumatati? &lt;br /&gt;
Vom muta in r cifre din n pana cand r devine mai mare ca n. Atentie la numerele cu zerouri la coada. Ex: 5500&lt;br /&gt;
&lt;br /&gt;
=== Permutari circulare a cifrelor numarului catre dreapta ===&lt;br /&gt;
Sa se afiseze toate numerele obtinute prin permutarea cifrelor lui n.&lt;br /&gt;
Ex: pentru n = 12345 vom afisa: 51234 45123 34512 23451 &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
  long long p = 1e12;&lt;br /&gt;
&lt;br /&gt;
  while ( p &amp;gt; n )&lt;br /&gt;
    p /= 10;&lt;br /&gt;
&lt;br /&gt;
  long long p2 = 10;&lt;br /&gt;
  while ( p &amp;gt; 1 ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; n % p2 * p + n / p2 &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    p /= 10;&lt;br /&gt;
    p2 *= 10;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Permutari circulare a cifrelor numarului catre stanga ===&lt;br /&gt;
Sa se afiseze toate numerele obtinute prin permutarea cifrelor lui n.&lt;br /&gt;
Ex: pentru n = 12345 vom afisa: 23451 34512 45123 51234&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
  long long p = 1e12;&lt;br /&gt;
&lt;br /&gt;
  while ( p &amp;gt; n )&lt;br /&gt;
    p /= 10;&lt;br /&gt;
&lt;br /&gt;
  long long p2 = 10;&lt;br /&gt;
  while ( p &amp;gt; 0 ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; n % p * p2 + n / p &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    p /= 10;&lt;br /&gt;
    p2 *= 10;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LABORATOR ==&lt;br /&gt;
===Eliminarea primei cifre===&lt;br /&gt;
Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.&lt;br /&gt;
==== Varianta1 ====&lt;br /&gt;
Vom construi un numar nou, adaugand la noul numar toate cifrele lui n, mai putin prima cifra. &lt;br /&gt;
 &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
!Pseudocod&lt;br /&gt;
!C/C++&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|&lt;br /&gt;
 integer n, p, x;&lt;br /&gt;
 read n;&lt;br /&gt;
 p ← 1;&lt;br /&gt;
 x ← 0;&lt;br /&gt;
 while (n &amp;gt; 9) do&lt;br /&gt;
   x ← (n mod 10) * p + x;  &lt;br /&gt;
   p ← p * 10;&lt;br /&gt;
   n ← n div 10;&lt;br /&gt;
 write x;&lt;br /&gt;
| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, p, x;&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;Dati un numar n:&amp;quot; &amp;lt;&amp;lt; endl;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  p = 1;&lt;br /&gt;
  x = 0;&lt;br /&gt;
  while (n &amp;gt; 9){&lt;br /&gt;
    x = (n % 10) * p + x;&lt;br /&gt;
    p = p * 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;Numarul rezultat este: &amp;quot; &amp;lt;&amp;lt; x;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Varianta2 ====&lt;br /&gt;
Vom calcula puterea lui 10 la care trebuie sa impartim numarul astfel incat sa eliminam prima cifra.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; &lt;br /&gt;
!Pseudocod&lt;br /&gt;
!C/C++&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
| &lt;br /&gt;
  integer n, p;&lt;br /&gt;
  read n;&lt;br /&gt;
  p = 1000000000;&lt;br /&gt;
  while(p&amp;gt;n)&lt;br /&gt;
    p = p / 10;&lt;br /&gt;
  write n % p;&lt;br /&gt;
| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, p;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  p = 1000000000;&lt;br /&gt;
  while(p&amp;gt;n)&lt;br /&gt;
    p = p / 10;&lt;br /&gt;
  cout &amp;lt;&amp;lt; n % p;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Numar corect scris in baza b ===&lt;br /&gt;
* 3. Se citeste un numar n. Verificati daca este un numar scris corect in baza b, unde b &amp;lt;=10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int n;&lt;br /&gt;
cin &amp;gt;&amp;gt; n;&lt;br /&gt;
cin&amp;gt;&amp;gt;b;      //citim b&lt;br /&gt;
ok = 1;      //presupunem ca e scris corect; folosim stegulet&lt;br /&gt;
while ( n &amp;gt; 0 ){    //si mai bine ar fi sa ne oprim cand gasim o cifra neok: while ( n &amp;gt; 0 &amp;amp;&amp;amp; ok==1)&lt;br /&gt;
  pcif = n % 10;&lt;br /&gt;
  if ( pcif &amp;gt; = b )//daca am gasit o cifra &amp;gt;b &lt;br /&gt;
    ok = 0;          //setam steguletul pe 0&lt;br /&gt;
  n = n % 10;      &lt;br /&gt;
}&lt;br /&gt;
if( ok == 1 )&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot; nr este corect in baza &amp;quot; &amp;lt;&amp;lt; b;&lt;br /&gt;
else&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot; nr nu este corect in baza&amp;quot;&amp;lt;&amp;lt; b;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putem de asemenea sa scriem algoritmul de mai sus fara a folosi o variabila stegulet; &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
while( n &amp;gt; 0 &amp;amp;&amp;amp; n % 10 &amp;lt; b)  //cata vreme am cifre si ultima cifra e ok&lt;br /&gt;
     n = n / 10;&lt;br /&gt;
if( n == 0 )&lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;e ok&amp;quot;;&lt;br /&gt;
else &lt;br /&gt;
  cout &amp;lt;&amp;lt; &amp;quot;nu e ok&amp;quot;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extragere cifre pare din n ===&lt;br /&gt;
* 2. Se citeste un numar n, de maxim 9 cifre. Afisati numarul care contine, in aceeasi ordine doar cifrele pare ale lui n. Ex: n = 12345, Se va afisa 24;&lt;br /&gt;
&lt;br /&gt;
==== Varianta1 ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  intreg n, p, ucif, nr;  &lt;br /&gt;
  citeste n;             // citim numarul n ca numar intreg&lt;br /&gt;
  p = 1;&lt;br /&gt;
  nr = 0;                // nr pe care il construim adaugand doar cifrele pare&lt;br /&gt;
  cat_timp ( n &amp;gt; 0 ) executa&lt;br /&gt;
    ucif = n mod 10;                 // extragem ultima cifra a lui n&lt;br /&gt;
    daca ( ucif mod 2 == 0 )  atunci // daca cifra este para&lt;br /&gt;
      nr = ucif * p + nr;            // adaugam cifra para in fata numarului nr&lt;br /&gt;
      p = p * 10;                    // calc puterea cu care trebuie sa inmultim la pasul urmator&lt;br /&gt;
    n = n div 10;                    // taiem ultima cifra din n&lt;br /&gt;
&lt;br /&gt;
  scrie nr;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, p, ucif, nr;&lt;br /&gt;
&lt;br /&gt;
  ///citim numarul n ca numar intreg&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
&lt;br /&gt;
  p = 1;&lt;br /&gt;
  nr = 0;               /// nr pe care il construim adaugand doar cifrele pare&lt;br /&gt;
  while ( n &amp;gt; 0 ){&lt;br /&gt;
    ucif = n % 10;          /// extragem ultima cifra a lui n&lt;br /&gt;
    if ( ucif % 2 == 0){    /// daca cifra este para&lt;br /&gt;
      nr = ucif * p + nr;   /// adaugam cifra para in fata numarului nr&lt;br /&gt;
      p = p * 10;           /// calculam puterea cu care trebuie sa inmultim la pasul urmator&lt;br /&gt;
    }&lt;br /&gt;
    n = n / 10;             /// taiem ultima cifra din n&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, nr );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Varianta2 ====&lt;br /&gt;
Varianta cu citire/afisare date din/in fisier varianta C.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, p10, nr, pcif;&lt;br /&gt;
  FILE *fin = fopen(&amp;quot;date.in&amp;quot;, &amp;quot;r&amp;quot;);     /// r de la read&lt;br /&gt;
  FILE *fout = fopen (&amp;quot;date.out&amp;quot;, &amp;quot;w&amp;quot;);  /// w de la write&lt;br /&gt;
  /// cititm n din fisierul de intrare&lt;br /&gt;
  fscanf(fin,&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
&lt;br /&gt;
  ///calculeaza puterea lui 10 care aproximeaza pe n ( mai mica sau egala cu n)&lt;br /&gt;
  p10 = 100000000;&lt;br /&gt;
  while ( p10 &amp;gt; n )&lt;br /&gt;
    p10 = p10 /10;&lt;br /&gt;
&lt;br /&gt;
  ///construiesc numarul cerut parcurgand cifrele incepand de la prima cifra a sa&lt;br /&gt;
  nr = 0;&lt;br /&gt;
  while ( p10 &amp;gt; 0 ){        /// ATENTIE! n&amp;gt;0 CA NU MERGE PT NUMERE CU ZEROURI LA COADA&lt;br /&gt;
    pcif = n / p10;         /// extrag prima cifra din n&lt;br /&gt;
    if ( pcif % 2 == 0)     /// daca cifra este para&lt;br /&gt;
      nr = nr * 10 + pcif;  /// adaug cifra la coada lui nr&lt;br /&gt;
    n = n % p10;            /// scot prima cifra din n&lt;br /&gt;
    p10 = p10 / 10;         /// ajustez puterea lui 10&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  ///afisam nr in fisierul; de iesire&lt;br /&gt;
  fprintf(fout, &amp;quot;%d&amp;quot;, nr);&lt;br /&gt;
  fclose(fin);&lt;br /&gt;
  fclose(fout);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Numere palindrom apropiate de n===&lt;br /&gt;
Varianta1: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n, &#039;&#039;&#039;diferit de n&#039;&#039;&#039;.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122&amp;lt;br/&amp;gt;&lt;br /&gt;
Ex2: n = 121 , afisam 111 131; 111, 131 sunt la aceeasi distanta fata de n&amp;lt;br/&amp;gt;&lt;br /&gt;
Ex3: n = 247 , afisam 242 252; 242, 252 sunt la aceeasi distanta fata de n&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, cn1, cn2, c1, c2, palin1, palin2, inv;&lt;br /&gt;
    cin&amp;gt;&amp;gt;n;               //citim n&lt;br /&gt;
    cn1=n-1;&lt;br /&gt;
    cn2=n+1;&lt;br /&gt;
    palin1 = palin2 = -1;                   //nu le-am gasit inca&lt;br /&gt;
    while (palin1 == -1 &amp;amp;&amp;amp; palin2 == -1){   //inca nu le-am gasit&lt;br /&gt;
      //verific daca cn1 e palindrom&lt;br /&gt;
      c1=cn1;&lt;br /&gt;
      inv = 0;&lt;br /&gt;
      while (c1 &amp;gt; 0){&lt;br /&gt;
        inv = inv * 10 + c1 % 10;&lt;br /&gt;
        c1 = c1 /10; //div&lt;br /&gt;
      }&lt;br /&gt;
      if (cn1 == inv ){&lt;br /&gt;
        palin1 = cn1;&lt;br /&gt;
      }&lt;br /&gt;
      //verific daca cn2 e palindrom&lt;br /&gt;
      c2=cn2;&lt;br /&gt;
      inv = 0;&lt;br /&gt;
      while (c2 &amp;gt; 0){&lt;br /&gt;
        inv = inv * 10 + c2 % 10;&lt;br /&gt;
        c2 = c2 /10; //div&lt;br /&gt;
      }&lt;br /&gt;
      if (cn2 == inv ){&lt;br /&gt;
        palin2 =cn2;&lt;br /&gt;
      }&lt;br /&gt;
      cn1 = cn1-1;&lt;br /&gt;
      cn2 = cn2+1;&lt;br /&gt;
    }&lt;br /&gt;
    if (palin1!=-1 &amp;amp;&amp;amp; palin2!=-1)   //cand am gasit 2 la aceeasi distanta&lt;br /&gt;
      cout&amp;lt;&amp;lt;palin1&amp;lt;&amp;lt;palin2;&lt;br /&gt;
    else if (palin1!=-1)            //daca am gasit doar pe palin1&lt;br /&gt;
      cout&amp;lt;&amp;lt;palin1;&lt;br /&gt;
    else&lt;br /&gt;
      cout&amp;lt;&amp;lt;palin2;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Varianta2: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n.&amp;lt;br/&amp;gt;&lt;br /&gt;
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122&amp;lt;br/&amp;gt;&lt;br /&gt;
Ex2: n = 121 , afisam 121 &amp;lt;br/&amp;gt;&lt;br /&gt;
Ex3: n = 247 , afisam 242 252; 242 si 252 sunt la aceeasi distanta fata de n&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, cn1, cn2, c1, c2, palin1, palin2, inv;&lt;br /&gt;
    cin&amp;gt;&amp;gt;n;               //citim n&lt;br /&gt;
    cn1=n;&lt;br /&gt;
    cn2=n;&lt;br /&gt;
    palin1 = palin2 = -1;                   //nu le-am gasit inca&lt;br /&gt;
    while (palin1 == -1 &amp;amp;&amp;amp; palin2 == -1){   //inca nu le-am gasit&lt;br /&gt;
      //verific daca cn1 e palindrom&lt;br /&gt;
      c1=cn1;&lt;br /&gt;
      inv = 0;&lt;br /&gt;
      while (c1 &amp;gt; 0){&lt;br /&gt;
        inv = inv * 10 + c1 % 10;&lt;br /&gt;
        c1 = c1 /10; //div&lt;br /&gt;
      }&lt;br /&gt;
      if (cn1 == inv ){&lt;br /&gt;
        palin1 = cn1;&lt;br /&gt;
      }&lt;br /&gt;
      //verific daca cn2 e palindrom&lt;br /&gt;
      c2=cn2;&lt;br /&gt;
      inv = 0;&lt;br /&gt;
      while (c2 &amp;gt; 0){&lt;br /&gt;
        inv = inv * 10 + c2 % 10;&lt;br /&gt;
        c2 = c2 /10; //div&lt;br /&gt;
      }&lt;br /&gt;
      if (cn2 == inv ){&lt;br /&gt;
        palin2 =cn2;&lt;br /&gt;
      }&lt;br /&gt;
      cn1 = cn1-1;&lt;br /&gt;
      cn2 = cn2+1;&lt;br /&gt;
    }&lt;br /&gt;
    if (palin1!=-1 &amp;amp;&amp;amp; palin2!=-1){   //cand am gasit 2 la aceeasi distanta&lt;br /&gt;
      if(palin1 == palin2)           //cand &lt;br /&gt;
        cout&amp;lt;&amp;lt;palin1;&lt;br /&gt;
      else&lt;br /&gt;
      cout&amp;lt;&amp;lt;palin1&amp;lt;&amp;lt;&amp;quot; &amp;quot;&amp;lt;&amp;lt;palin2;&lt;br /&gt;
    }&lt;br /&gt;
      &lt;br /&gt;
    else if (palin1!=-1)            //daca am gasit doar pe palin1&lt;br /&gt;
      cout&amp;lt;&amp;lt;palin1;&lt;br /&gt;
    else&lt;br /&gt;
      cout&amp;lt;&amp;lt;palin2;&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
== Teorie == &lt;br /&gt;
*https://www.pbinfo.ro/probleme/66/numaruldecifre - Teorie&lt;br /&gt;
*https://www.pbinfo.ro/probleme/77/ultimacifrapara&lt;br /&gt;
*https://www.pbinfo.ro/probleme/65/produscifreimpare&lt;br /&gt;
*https://www.pbinfo.ro/probleme/3078/prod-k&lt;br /&gt;
*https://www.pbinfo.ro/probleme/942/cifre23&lt;br /&gt;
*https://www.pbinfo.ro/probleme/107/aparitii&lt;br /&gt;
*https://www.pbinfo.ro/probleme/68/ciframaxima - Teorie&lt;br /&gt;
*https://www.pbinfo.ro/probleme/121/ciframaxima2 - Teorie&lt;br /&gt;
*https://www.pbinfo.ro/probleme/2288/cifraimparamaxima&lt;br /&gt;
*https://www.pbinfo.ro/probleme/3254/prod-pi&lt;br /&gt;
*https://www.pbinfo.ro/probleme/69/oglindit - Teorie&lt;br /&gt;
&lt;br /&gt;
== Laborator ==&lt;br /&gt;
* https://www.pbinfo.ro/probleme/108/aparitii2&lt;br /&gt;
* https://www.pbinfo.ro/probleme/2660/produsprimeledouacifre&lt;br /&gt;
* https://www.pbinfo.ro/probleme/4212/inccifpare&lt;br /&gt;
* Sa se afiseze cel mai mare numar palindrom care se poate scrie ca produs de 2 numere cu k cifre (mai grea, nu mai stiu unde e publicata).&lt;br /&gt;
&lt;br /&gt;
== Probleme de concurs ==&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/3384/codjoc codjoc]&lt;br /&gt;
* [http://varena.ro/problema/semipalindrom semipalindrom]&lt;br /&gt;
* [http://varena.ro/problema/parola parola]&lt;br /&gt;
* [http://varena.ro/problema/permcif permcif]&lt;br /&gt;
&lt;br /&gt;
== Codeforces ==&lt;br /&gt;
* [http://codeforces.com/contest/1247/problem/A Forgetting Things]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_V-a_lec%C8%9Bia_5_S3&amp;diff=18254</id>
		<title>Clasa a V-a lecția 5 S3</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_V-a_lec%C8%9Bia_5_S3&amp;diff=18254"/>
		<updated>2022-10-04T09:28:55Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lectie =&lt;br /&gt;
== Programarea structurată ==&lt;br /&gt;
Programarea structurată este un mod de a scrie scheme logice care îmbunătățește claritatea, citibilitatea, calitatea și ușurința modificării ulterioare. Denumirea vine de la &#039;&#039;Programarea cu structuri&#039;&#039;. Mai exact, programarea structurată ne limitează modul în care putem folosi și îmbina blocurile. Ele pot fi aranjate în trei feluri distincte, conform unor modele numite structuri. Aceste structuri sunt:&lt;br /&gt;
* Structura liniară (de calcul)&lt;br /&gt;
* structura alternativă (decizională)&lt;br /&gt;
* structura repetitivă (ciclică)&lt;br /&gt;
&lt;br /&gt;
=== Structura liniară ===&lt;br /&gt;
Se mai numește și structură de calcul. Ea constă dintr-o înșiruire de blocuri de calcul și blocuri de citire/scriere. Aceste blocuri se vor executa in ordinea in care ele apar in structura.&lt;br /&gt;
[[Image:sl-structura-liniara.gif|frame|none|Structura liniară]]&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Extragerea ultimei cifre ====&lt;br /&gt;
Să se afișeze ultima cifră a unui număr n, folosind operatorul &#039;%&#039;, respectiv restul împărțirii la 10. Am demonstrat că restul împărțirii la 10 este ultima cifră a unui număr.&lt;br /&gt;
[[Image:sl-ultima-cifra.gif|frame|none|Ultima cifră a lui n]]&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// implementare c++&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main (){&lt;br /&gt;
  int n;&lt;br /&gt;
  int cf;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  cf = n % 10;&lt;br /&gt;
  cout &amp;lt;&amp;lt; cf;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Structura alternativă ===&lt;br /&gt;
Structura alternativă este compusă dintr-un bloc de decizie, două ramuri de execuție, &#039;&#039;DA&#039;&#039; și &#039;&#039;NU&#039;&#039;, care se reunesc la final. Blocul de decizie contine o expresie logica. Daca expresia logica ( cond ) are valoarea  True atunci se vor executa intructiunile de pe ramura &#039;&#039;DA&#039;&#039; altfel se vor executa intructiunile de pe ramura &#039;&#039;NU&#039;&#039;.&lt;br /&gt;
[[Image:sl-structura-alternativa.gif|frame|none|Structura alternativă]]&lt;br /&gt;
&lt;br /&gt;
Pseudocod&lt;br /&gt;
 daca conditie atunci&lt;br /&gt;
   set_instructiuni1&lt;br /&gt;
 altfel&lt;br /&gt;
   set_instructiuni2&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
if (conditie ){&lt;br /&gt;
  set_instructiuni1;&lt;br /&gt;
}&lt;br /&gt;
else {&lt;br /&gt;
  set_instructiuni1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Exemple ===&lt;br /&gt;
==== Testul de divizibilitate ====&lt;br /&gt;
Testul de divizibilitate &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; cu &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt;, discuție cele două metode, prima folosind operatorul &amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt;, a doua folosind operatorul &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| [[Image:sl-n-div-k-var-1.gif|frame|none|n divizibil cu k, varianta 1]]&lt;br /&gt;
| [[Image:sl-n-div-k-var-2.gif|frame|none|n divizibil cu k, varianta 2]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// implementare c++&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main (){&lt;br /&gt;
  int n, k;&lt;br /&gt;
 &lt;br /&gt;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;&lt;br /&gt;
  if ( n % k == 0 )&lt;br /&gt;
    cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt;&amp;quot; se divide la&amp;quot; &amp;lt;&amp;lt; k;&lt;br /&gt;
  else&lt;br /&gt;
   cout &amp;lt;&amp;lt; n &amp;lt;&amp;lt;&amp;quot; nu se divide la&amp;quot; &amp;lt;&amp;lt; k;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Extragerea primei cifre ====&lt;br /&gt;
Se citește n, un număr natural strict mai mic decît 100. Să se afișeze prima cifră a lui n. [[Image:prima-cifra.gif|frame|none|Prima cifră a lui n, n &amp;lt; 100]]&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// implementare in c++&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main (){&lt;br /&gt;
  int n, c;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  if ( n &amp;lt; 10 )&lt;br /&gt;
    c = n ;&lt;br /&gt;
  else&lt;br /&gt;
   c = n / 10;&lt;br /&gt;
   cout &amp;lt;&amp;lt; c;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Laturile unui triunghi ( doar pentru liceu ) ===&lt;br /&gt;
Se citesc trei numere, a, b și c. Să se spună dacă pot fi laturile unui triunghi. [[Image:laturi-triunghi.gif|frame|none|a, b, c pot fi laturile unui triunghi?]]&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// implementare in c++&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main (){&lt;br /&gt;
  int a, b, c;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c;&lt;br /&gt;
  if ( a + b &amp;gt; c )&lt;br /&gt;
    if ( b + c &amp;gt; a )&lt;br /&gt;
      if ( a + c &amp;gt; b )&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;pot form triunghi&amp;quot;;&lt;br /&gt;
      else&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;nu pot forma triunghi&amp;quot;;&lt;br /&gt;
    else&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;nu pot forma triunghi&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
        cout &amp;lt;&amp;lt; &amp;quot;nu pot forma triunghi&amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Strîngeri de mînă ===&lt;br /&gt;
Avem &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; oameni care dau mîna fiecare cu fiecare o singură dată. În total sînt &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; strîngeri de mînă. Să se scrie o schemă logică care citește &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; (numărul de strîngeri de mînă), apoi calculează și afișează &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; (numărul de oameni). [[Image:sl-stringeri-de-mina.gif|frame|none|n oameni dau mîna. Sînt k strîngeri de mînă. Dîndu-se k să se calculeze n.]]&lt;br /&gt;
&lt;br /&gt;
=== Maximul a trei numere ===&lt;br /&gt;
Se citesc trei numere, &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; și &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt;. Să se afișeze valoarea maximă.&lt;br /&gt;
{|&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;| [[Image:sl-max-3-nr-1.gif|frame|none|maximul a trei numere, varianta 1]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;| [[Image:sl-max-3-nr-2.gif|frame|none|maximul a trei numere, varianta 2]]&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// implementare in c++ ( pentru algoritmul din a doua schema )&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main (){&lt;br /&gt;
  int a, b, c, maxim;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; a &amp;gt;&amp;gt; b &amp;gt;&amp;gt; c;&lt;br /&gt;
  maxim = a;&lt;br /&gt;
  if ( b &amp;gt; maxim )&lt;br /&gt;
    maxim = b;&lt;br /&gt;
  if( c &amp;gt; maxim )&lt;br /&gt;
    maxim = c;&lt;br /&gt;
  cout &amp;lt;&amp;lt; maxim;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sortarea a 3 numere ===&lt;br /&gt;
* Se citesc trei numere, a, b și c. Să se afișeze în ordine crescătoare. Exemplu: dacă a = 8, b = 4, c = 12, se va afișa 4 8 12.&lt;br /&gt;
&lt;br /&gt;
[[Image:sl-sortare-3-nr.gif|frame|none|Afișare a, b și c în ordine crescătoare, varianta 1]]&lt;br /&gt;
[[Image:sl-3-nr-crescatoare-var-2.gif|frame|none|Afișare a, b și c în ordine crescătoare, varianta 2]]&lt;br /&gt;
&lt;br /&gt;
Am discutat la clasa de asemenea inca 2 metode de sortare, pe care le putem folosi si in situatia in care avem mai mult de 3 numere:&lt;br /&gt;
- metoda interschimbarii directe&lt;br /&gt;
- metoda bulelor&lt;br /&gt;
==== Metoda interschimbarii directe ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
intreg a, b, c, aux&lt;br /&gt;
read a, b, c&lt;br /&gt;
&lt;br /&gt;
if ( a &amp;gt; b ) than&lt;br /&gt;
  aux = a&lt;br /&gt;
  a = b;&lt;br /&gt;
  b = aux&lt;br /&gt;
if ( a &amp;gt; c ) than&lt;br /&gt;
  aux = a&lt;br /&gt;
  a = c;&lt;br /&gt;
  c = aux&lt;br /&gt;
if ( b &amp;gt; c ) than&lt;br /&gt;
  aux = b&lt;br /&gt;
  b = c;&lt;br /&gt;
  c = aux&lt;br /&gt;
write a, b, c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Metoda bulelor ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
intreg a, b, c, aux&lt;br /&gt;
cieste a, b, c&lt;br /&gt;
&lt;br /&gt;
if ( a &amp;gt; b ) atunci&lt;br /&gt;
  aux = a&lt;br /&gt;
  a = b;&lt;br /&gt;
  b = aux&lt;br /&gt;
if ( b &amp;gt; c ) atunci&lt;br /&gt;
  aux = b&lt;br /&gt;
  b = c;&lt;br /&gt;
  c = aux&lt;br /&gt;
if ( a &amp;gt; b ) atunci&lt;br /&gt;
  aux = a&lt;br /&gt;
  a = b;&lt;br /&gt;
  b = aux&lt;br /&gt;
scrie a, b, c&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cifre impare ===&lt;br /&gt;
Se citește un număr &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;. Se știe că &amp;lt;tt&amp;gt;1 &amp;amp;le; n &amp;lt; 100&amp;lt;/tt&amp;gt;. Să se spună dacă toate cifrele lui &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; sînt impare.&lt;br /&gt;
{|&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;| [[Image:sl-cifre-impare-1.gif|frame|none|Toate cifrele lui n sînt impare, varianta 1]]&lt;br /&gt;
| valign=&amp;quot;top&amp;quot;| [[Image:sl-cifre-impare-2.gif|frame|none|Toate cifrele lui n sînt impare, varianta 2]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Numere divizibile cu K din [a,b] ===&lt;br /&gt;
Se citesc trei numere naturale, &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; și &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt;. Să se afișeze numărul de numere divizibile cu &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; în intervalul &amp;lt;tt&amp;gt;[a, b]&amp;lt;/tt&amp;gt; (inclusiv &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; și &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt;). [[Image:div-cu-k.gif|frame|none|Cîte numere divizibile cu k se află în intervalul [a, b]?]]&lt;br /&gt;
&lt;br /&gt;
== Exerciții 2==&lt;br /&gt;
Exerciții de folosire a structurilor liniară și alternativă folosind - Pseudocod&lt;br /&gt;
&lt;br /&gt;
=== Diferenta dintre max si min ===&lt;br /&gt;
Să se scrie un program  care citeşte de la tastatură trei numere naturale și determină diferenţa dintre cel mai mare şi cel mai mic numar.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
intreg a, b, c&lt;br /&gt;
citeste a, b, c&lt;br /&gt;
min=a&lt;br /&gt;
max=a&lt;br /&gt;
daca ( min &amp;gt; b ) atunci&lt;br /&gt;
  min = b&lt;br /&gt;
daca ( min &amp;gt; c ) atunci&lt;br /&gt;
  min = c&lt;br /&gt;
daca ( max &amp;lt; b ) atunci&lt;br /&gt;
  max = b&lt;br /&gt;
daca ( max &amp;lt; c ) atunci&lt;br /&gt;
  max = c&lt;br /&gt;
scrie  max - min;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Cate cifre pare are n? ===&lt;br /&gt;
Se citește de la tastatură un număr natural de 3 cifre. Să se determine &lt;br /&gt;
câte cifre impare conține.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int n, contor;&lt;br /&gt;
citeste n&lt;br /&gt;
contor = 0&lt;br /&gt;
daca ( n mod 2 != 0 ) atunci&lt;br /&gt;
  contor = contor + 1&lt;br /&gt;
daca( n div 10 mod 2 != 0 )&lt;br /&gt;
  contor = contor + 1&lt;br /&gt;
daca ( n div 100 mod 2 != 0 )&lt;br /&gt;
  contor = contor + 1&lt;br /&gt;
scrie contor&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Au 2 numere acelasi semn? ===&lt;br /&gt;
Să se scrie un program care citeşte de la tastatură două numere întregi şi verifică dacă cele doua numere au acelaşi semn.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
intreg a,b&lt;br /&gt;
citeste a, b&lt;br /&gt;
daca ( a &amp;lt; 0 ) atunci&lt;br /&gt;
  daca ( b &amp;lt; 0 ) atunci&lt;br /&gt;
     scrie &amp;quot;au acelasi semn&amp;quot;&lt;br /&gt;
  altfel &lt;br /&gt;
      scrie &amp;quot;nu au acelasi semn&amp;quot;&lt;br /&gt;
altfel&lt;br /&gt;
   daca ( b &amp;gt;= 0 ) atunci&lt;br /&gt;
      scrie &amp;quot;au acelasi semn&amp;quot;&lt;br /&gt;
   altel&lt;br /&gt;
      scrie &amp;quot;nu au acelasi semn&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SAU&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
intregi a, b&lt;br /&gt;
citeste a, b&lt;br /&gt;
daca ( ( a &amp;lt; 0 ) AND ( b &amp;lt; 0 ) ) OR ( ( a &amp;gt;= 0 AND b &amp;gt;= 0 ) ) atunci&lt;br /&gt;
    scrie &amp;quot;au acelasi semn&amp;quot;&lt;br /&gt;
altfel &lt;br /&gt;
    scrie &amp;quot;nu au acelasi semn&amp;quot;   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SAU&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
intregi a, b&lt;br /&gt;
citeste a, b&lt;br /&gt;
daca  ( a &amp;lt; 0 AND b &amp;gt;= 0 ) OR ( a &amp;gt;= 0 AND b &amp;lt; 0 )  atunci&lt;br /&gt;
    scrie &amp;quot;nu au acelasi semn&amp;quot;&lt;br /&gt;
altfel &lt;br /&gt;
    scrie &amp;quot;au acelasi semn&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Tema 4 Laborator ==&lt;br /&gt;
===N are ultimele 2 cifre consecutive?===&lt;br /&gt;
* Să se spună dacă un număr n are ultimele două cifre consecutive, în ordine crescătoare. Exemple: 312, 4523 și 1 sînt numere care au ultimele două cifre consecutive. 215, 4321 și 7 nu au ultimele două cifre consecutive crescător.&lt;br /&gt;
&lt;br /&gt;
===N copii se pot aseza in forma de patrat===&lt;br /&gt;
* Varianta1: să se spună dacă n copii se pot așeza în formă de pătrat plin. Exemplu: Nouă copii se pot așeza în formă de pătrat astfel: &lt;br /&gt;
 x x x&lt;br /&gt;
 x x x&lt;br /&gt;
 x x x&lt;br /&gt;
&lt;br /&gt;
* Varianta2: să se spună dacă n copii se pot așeza în formă de pătrat gol ( pe laturile unui patrat. In imaginile de mai sus vom considera ca locuri posibile doar conturul patratului. De exemplu 12 copii se pot aseza sub forma unui patrat gol astfel:&lt;br /&gt;
 x x x x &lt;br /&gt;
 x     x&lt;br /&gt;
 x     x&lt;br /&gt;
 x x x x&lt;br /&gt;
&lt;br /&gt;
===An bisect===&lt;br /&gt;
* Scrieți o schemă logică care să determine dacă un an este bisect. Un an este bisect dacă este divizibil cu 4, cu excepția anilor divizibili cu 100, care nu sînt bisecți, cu excepția anilor divizibili cu 400 care sînt bisecți. Exemple: 2012 este an bisect, 1900 nu a fost an bisect, 2000 a fost an bisect.&lt;br /&gt;
&lt;br /&gt;
=== Tema Pbinfo ===&lt;br /&gt;
&#039;&#039;&#039;Usor&#039;&#039;&#039;&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/2765/checkcolor checkcolor]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/448/ciford ciford] - ordonarea cifrelor unui numar de 3 cifre&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/447/cifmid cifmid] - afisare cifra din mijloc ca valoare&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/559/5numere 5numere] - suma celor mai mari 3 numere din 5 date&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/3275/nrsumcifmax  nrsumcifmax] - afisarea tuturor numerelor egale cu max din 3 numere&lt;br /&gt;
&#039;&#039;&#039;Mediu &#039;&#039;&#039;&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/1943/bacterie bacterie]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/2908/planta planta]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/3207/cercuri cercuri]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/3925/rest1 rest1]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/382/aproapek aproapek]&lt;br /&gt;
&#039;&#039;&#039;Dificil&#039;&#039;&#039;&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/1002/paginare paginare]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/1934/catalin-si-elfii-magici catalin-si-elfii-magici]&lt;br /&gt;
=== Tema codeforces ===&lt;br /&gt;
* https://codeforces.com/contest/476/problem/A&lt;br /&gt;
* https://codeforces.com/contest/742/problem/A&lt;br /&gt;
* https://codeforces.com/contest/670/problem/A&lt;br /&gt;
&lt;br /&gt;
===Probleme de pe campion ===&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=1067 triunghi1]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia6&amp;diff=18245</id>
		<title>10 2018 Lectia6</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia6&amp;diff=18245"/>
		<updated>2021-11-23T14:38:47Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Tema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lectie =&lt;br /&gt;
= Sirurile de caractere =&lt;br /&gt;
*[http://algopedia.ro/wiki/index.php/Clasa_a_IX-a_lec%C8%9Bia_14 Recapitulare tipul char]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Definitie:&#039;&#039;&#039;&lt;br /&gt;
Un sir de caractere este o structură de date formată dintr-o succesiune de caractere care se termină cu caracterul &#039;&#039;&#039;NULL&#039;&#039;&#039; (’ \0’).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Implementare&#039;&#039;&#039; &lt;br /&gt;
Sirurile de caractere se reprezinta sub forma unui tablou unidimensional (vector) ale cărui elemente sunt de tip caracter, fiecare caracter fiind reprezentat prin codul său ASCII. Sirul de caractere se deosebeste de vectorii cu alte tipuri de elemente prin marcatorul logic utilizat la sfârsitul sirului - NULL (care are codul ASCII 0).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Declarare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
char x[5]; // am declarat sirul x care va putea contine maxim 5 caractere &lt;br /&gt;
cin &amp;gt;&amp;gt; x;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Initializare&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
char x[5] = &amp;quot;mama&amp;quot;; // am reervat explicit 5 octeti, pentru cele 4 caractere cat si pt caracterul null&lt;br /&gt;
char x[] = &amp;quot;mama&amp;quot;;  // numarul de octeti rezervati este nr de caractere din constanta sir + 1&lt;br /&gt;
char x[20] = &amp;quot;mama&amp;quot;;// am rezervat 20 de locatii din care am utilizat 5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dimensiunea vectorului de caractere trebuie declarată cu un caracter mai mult decât cel mai mare sir de caractere pe care îl poate contine, pentru a exista loc si pentru terminatorul sirului (caracterul ‘\0’).&lt;br /&gt;
O constantă sir de caractere este o succesiune de caractere delimitată de ghilimele.&lt;br /&gt;
ex: char sir[256] = ”Buna ziua”;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Citirea în limbajul C++&#039;&#039;&#039;&lt;br /&gt;
- se poate utiliza operatorul &amp;gt;&amp;gt;  :&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cin &amp;gt;&amp;gt; s; ( doar dacă s este un cuvânt )&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
sau una din functiile get sau getline:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
char c, sir[201];&lt;br /&gt;
fin &amp;gt;&amp;gt; c;&lt;br /&gt;
fin.getline(sir, 200); //sau fin.get(sir,200);fin.get();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Prototipurile functiilor get si getline:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;getline(char *s, int n, char c=’\n’);&lt;br /&gt;
get(char *s, int n, char c=’\n’);&#039;&#039;&#039;&lt;br /&gt;
Diferenta dintre functiile get si getline este faptul că functia getline preia din stream-ul de intrare si delimitatorul, în timp ce functia get nu-l extrage.&lt;br /&gt;
Scrierea în limbajul C++&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
fout &amp;lt;&amp;lt; c &amp;lt;&amp;lt; ’ ’ &amp;lt;&amp;lt; s;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Obs.&#039;&#039;&#039;&lt;br /&gt;
1. Citirea sirurilor de caractere la care se utilizează operatorul &amp;gt;&amp;gt; se opreste la întâlnirea primului caracter alb.&lt;br /&gt;
2.Dacă delimitatorul este altul decât ‘\n’, acesta trebuie precizat pe pozitia corespunzătoarelui în functia getline.&lt;br /&gt;
‘m’ ‘a’ ‘m’ ‘a’ ‘\0’&lt;br /&gt;
&lt;br /&gt;
Aplicatii&lt;br /&gt;
&lt;br /&gt;
    1. Se citeste de la tastatura un sir de caractere folosind functiile de citire studiate. Sa se afiseze acest sir.&lt;br /&gt;
    a) Citire cu cin.get si afisare cu cout&lt;br /&gt;
    b) Citire cu cin.getline si afisare cu cout&lt;br /&gt;
    2. Se citesc de la tastatura 2 siruri de caractere. Sa se afiseze aceste siruri fiecare pe cate o linie.&lt;br /&gt;
    a) Citire cu cin.get si afisare cu cout&lt;br /&gt;
    b) Citire cu cin.getline si afisare cu cout&lt;br /&gt;
&lt;br /&gt;
== Prelucrari secventiale de siruri de caractere ==&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=11 #11 Vocale]  ===&lt;br /&gt;
Să se scrie un program care citeşte un şir de caractere format din litere mici ale alfabetului englez şi înlocuieşte fiecare vocală cu litera mare corespunzătoare.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! C prelucrare caracter cu caracter !! C++ prelucrare caracter cu caracter&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int e_vocala ( char c ) {&lt;br /&gt;
  if ( c == &#039;a&#039; || c == &#039;e&#039; || c == &#039;i&#039; || c == &#039;o&#039; || c == &#039;u&#039; )&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  char c;&lt;br /&gt;
  c = fgetc(stdin);&lt;br /&gt;
  while( c != &#039;\n&#039; &amp;amp;&amp;amp; c != EOF ) {&lt;br /&gt;
   if(e_vocala(c))&lt;br /&gt;
      fputc( c+&#039;A&#039;-&#039;a&#039;, stdout);&lt;br /&gt;
   else&lt;br /&gt;
      fputc( c, stdout );&lt;br /&gt;
    c = fgetc(stdin);   &lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int e_vocala ( char c ) {&lt;br /&gt;
  if ( c == &#039;a&#039; || c == &#039;e&#039; || c == &#039;i&#039; || c == &#039;o&#039; || c == &#039;u&#039; )&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  char c;&lt;br /&gt;
  cin.get(c);&lt;br /&gt;
  while(c!=&#039;\n&#039; &amp;amp;&amp;amp; !cin.eof()) {&lt;br /&gt;
   if(e_vocala(c))&lt;br /&gt;
      cout&amp;lt;&amp;lt;(char)(c+&#039;A&#039;-&#039;a&#039;);&lt;br /&gt;
   else&lt;br /&gt;
      cout&amp;lt;&amp;lt;c;&lt;br /&gt;
    cin.get(c);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! C !! C++&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Citim un sir de caractere,&lt;br /&gt;
//il prelucram pe parcursul citirii si afisam caracterele rezultate&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int e_vocala ( char c ) {&lt;br /&gt;
  if ( c == &#039;a&#039; || c == &#039;e&#039; || c == &#039;i&#039; || c == &#039;o&#039; || c == &#039;u&#039; )&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  char s[100];        // char *s;&lt;br /&gt;
  cin &amp;gt;&amp;gt; s;           // daca nu e era doar un cuvant : cin.get( s, 200 );&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  while( s[i] ) {&lt;br /&gt;
    if( e_vocala(s[i]) )&lt;br /&gt;
      cout&amp;lt;&amp;lt;(char)( s[i]+&#039;A&#039;-&#039;a&#039;);&lt;br /&gt;
   else&lt;br /&gt;
      cout &amp;lt;&amp;lt; s[i];&lt;br /&gt;
   i++;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Citim un sir de caractere,&lt;br /&gt;
//modificam elementele sirului si la final afisam sirul modificat&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int e_vocala ( char c ) {&lt;br /&gt;
  if ( c == &#039;a&#039; || c == &#039;e&#039; || c == &#039;i&#039; || c == &#039;o&#039; || c == &#039;u&#039; )&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  char s[100];        // char *s;&lt;br /&gt;
  cin &amp;gt;&amp;gt; s;           // daca nu e era doar un cuvant : cin.get( s, 200 );&lt;br /&gt;
  int i = 0;&lt;br /&gt;
  while( s[i] ) {     // s[i] != &#039;\0&#039; , nu am ajuns la sfarsitul sirului&lt;br /&gt;
    if( e_vocala(s[i]) )&lt;br /&gt;
      s[i] = s[i]+&#039;A&#039;-&#039;a&#039;;&lt;br /&gt;
   i++;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; s;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=972 #972 Pozitii] ===&lt;br /&gt;
* Se da un sir de caractere. Sa se determine câte vocale din sir sunt cuprinse intre doua consoane.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
char evoc ( char c ) {&lt;br /&gt;
  if ( c == &#039;a&#039; || c == &#039;e&#039; || c == &#039;i&#039; || c == &#039;o&#039; || c == &#039;u&#039; )&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
char econs ( char c ) {&lt;br /&gt;
  if ( c &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
      if ( !evoc(c))&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  char s[256];&lt;br /&gt;
  int  contor, i;&lt;br /&gt;
  cin.get( s, 255 );&lt;br /&gt;
  contor = 0;   // cate vocale sunt intre 2 consoane&lt;br /&gt;
  i = 1;&lt;br /&gt;
  while( s[i+1] != &#039;\0&#039; ) {&lt;br /&gt;
    if ( econs(s[i-1]) &amp;amp;&amp;amp; econs(s[i+1]) &amp;amp;&amp;amp; evoc(s[i]) )&lt;br /&gt;
      contor ++;&lt;br /&gt;
    i++;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; contor;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! C !! C++&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char evoc ( char c ) {&lt;br /&gt;
  if ( c == &#039;a&#039; || c == &#039;e&#039; || c == &#039;i&#039; || c == &#039;o&#039; || c == &#039;u&#039; )&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
char econs ( char c ) {&lt;br /&gt;
  if ( c &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
      if ( !evoc(c))&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  char c1, c2, c3;&lt;br /&gt;
  int  contor, i;&lt;br /&gt;
  c3 = getc(stdin);&lt;br /&gt;
  contor = 0;&lt;br /&gt;
  while( c3 != &#039;\n&#039; &amp;amp;&amp;amp; c3 != EOF ){&lt;br /&gt;
    i++;&lt;br /&gt;
    if( i &amp;gt; 2 )&lt;br /&gt;
      if ( econs(c1) &amp;amp;&amp;amp; econs(c3) &amp;amp;&amp;amp; evoc(c2) )&lt;br /&gt;
        contor ++;&lt;br /&gt;
    c1 = c2;&lt;br /&gt;
    c2 = c3;&lt;br /&gt;
    c3 = getc(stdin);&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, contor );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
char evoc ( char c ) {&lt;br /&gt;
  if ( c == &#039;a&#039; || c == &#039;e&#039; || c == &#039;i&#039; || c == &#039;o&#039; || c == &#039;u&#039; )&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
char econs ( char c ) {&lt;br /&gt;
  if ( c &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c &amp;lt;= &#039;z&#039; )&lt;br /&gt;
      if ( !evoc(c))&lt;br /&gt;
      return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  char c1, c2, c3;&lt;br /&gt;
  int  contor, i;&lt;br /&gt;
  cin.get(c3);&lt;br /&gt;
  contor = 0;&lt;br /&gt;
  while( c3 != &#039;\n&#039; &amp;amp;&amp;amp; c3 != EOF ){&lt;br /&gt;
    i++;&lt;br /&gt;
    if( i &amp;gt; 2 )&lt;br /&gt;
      if ( econs(c1) &amp;amp;&amp;amp; econs(c3) &amp;amp;&amp;amp; evoc(c2) )&lt;br /&gt;
        contor ++;&lt;br /&gt;
    c1 = c2;&lt;br /&gt;
    c2 = c3;&lt;br /&gt;
    cin.get(c3);&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; contor;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=12 #12 Initiale] === &lt;br /&gt;
Să se scrie un program care citeşte de la tastatură o propoziţie formată din mai multe cuvinte separate prin spaţii şi transformă prima şi ultima literă a fiecărui cuvânt în literă mare.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! C - Folosind 3 variabile&lt;br /&gt;
 !! C - Folosind 2 variabile&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, i;&lt;br /&gt;
    char c1, c2, c3;&lt;br /&gt;
    c1 = &#039; &#039;;&lt;br /&gt;
    c2 = fgetc( stdin );&lt;br /&gt;
    c3 = fgetc( stdin );&lt;br /&gt;
    while ( c3 != &#039;\n&#039; &amp;amp;&amp;amp; c3 != EOF ) {&lt;br /&gt;
      if ( c2 &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c2 &amp;lt;= &#039;z&#039;  &amp;amp;&amp;amp; (c1 == &#039; &#039; || c3 == &#039; &#039; ) )   // c2 e prima litera din cuv&lt;br /&gt;
        c2 = c2 - 32;&lt;br /&gt;
      fputc( c2, stdout );&lt;br /&gt;
      c1 = c2;&lt;br /&gt;
      c2 = c3;&lt;br /&gt;
      c3 = fgetc( stdin );&lt;br /&gt;
    }&lt;br /&gt;
    if ( c2 &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c2 &amp;lt;= &#039;z&#039;)&lt;br /&gt;
      fputc( c2 - 32, stdout );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|| &amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, i;&lt;br /&gt;
    char c1, c2;&lt;br /&gt;
    c1 = fgetc( stdin );&lt;br /&gt;
    if ( c1 &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c1 &amp;lt;= &#039;z&#039; )                    // daca primul caracter e litera&lt;br /&gt;
      c1 = c1 - 32;&lt;br /&gt;
    c2 = fgetc( stdin );&lt;br /&gt;
    while ( c2 != &#039;\n&#039; &amp;amp;&amp;amp; c2 != EOF ) {&lt;br /&gt;
      if ( c2 &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c2 &amp;lt;= &#039;z&#039;  &amp;amp;&amp;amp; c1 == &#039; &#039; )    // c2 e prima litera din cuv&lt;br /&gt;
        c2 = c2 - 32;&lt;br /&gt;
      if ( c1 &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c1 &amp;lt;= &#039;z&#039;  &amp;amp;&amp;amp; c2 == &#039; &#039; )    // c1 e sf de cuvant&lt;br /&gt;
          c1 = c1 - 32;&lt;br /&gt;
      fputc( c1, stdout );&lt;br /&gt;
      c1 = c2;&lt;br /&gt;
      c2 = fgetc( stdin );&lt;br /&gt;
    }&lt;br /&gt;
    if ( c1 &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; c1 &amp;lt;= &#039;z&#039; )&lt;br /&gt;
      c1 = c1 - 32;&lt;br /&gt;
    fputc( c1, stdout );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Putem de asemenea sa citim caracter cu caracter si sa formam cate un cuvand, modificam cuvantul si il afisam.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
char* uppcuv( char *s, int lung ){&lt;br /&gt;
  if( s[0] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; s[0] &amp;lt;= &#039;z&#039; )&lt;br /&gt;
    s[0] = s[0] - &#039;a&#039; + &#039;A&#039;;&lt;br /&gt;
  if( s[lung-1] &amp;gt;= &#039;a&#039; &amp;amp;&amp;amp; s[lung-1] &amp;lt;= &#039;z&#039; )&lt;br /&gt;
    s[lung-1] = s[lung-1] - &#039;a&#039; + &#039;A&#039;;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  char c;&lt;br /&gt;
  char cuv[200];&lt;br /&gt;
  int incuv, lung;&lt;br /&gt;
  cin.get( c );&lt;br /&gt;
  incuv = 0; lung = 0;&lt;br /&gt;
  while( c != &#039;\n&#039; &amp;amp;&amp;amp; !cin.eof() ){&lt;br /&gt;
    if( c != &#039; &#039; )          // daca am litera&lt;br /&gt;
      if( incuv == 1){      // si sunt cuvant&lt;br /&gt;
        cuv[lung++] = c;    // adaug litera la cuvant&lt;br /&gt;
      }&lt;br /&gt;
      else{                 // am litera si inainte a fost spatiu&lt;br /&gt;
        incuv = 1;          // declar ca sunt in cuvant&lt;br /&gt;
        lung = 0;           // rezetez contorul de litere din cuvant&lt;br /&gt;
        cuv[lung++] = c;    // pun prima litera in cuvant&lt;br /&gt;
      }&lt;br /&gt;
    else {                          // daca am spatiu&lt;br /&gt;
      if( incuv == 1){              // si inainte era cuvant&lt;br /&gt;
        cuv[lung] = 0;&lt;br /&gt;
        cout &amp;lt;&amp;lt; uppcuv(cuv,lung);   // tiparesc cuvantul modificat&lt;br /&gt;
        incuv = 0;&lt;br /&gt;
      }&lt;br /&gt;
      cout&amp;lt;&amp;lt;c;&lt;br /&gt;
    }&lt;br /&gt;
    cin.get( c );             // citesc un nou caracter&lt;br /&gt;
  }&lt;br /&gt;
  if (incuv ){&lt;br /&gt;
    cuv[lung] = 0;&lt;br /&gt;
    cout &amp;lt;&amp;lt; uppcuv(cuv,lung);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==LungSortDesc  ==&lt;br /&gt;
Se dă un șir de caractere în care cuvintele sunt formate din litere mici și mari ale alfabetului englez și sunt separate prin spații.&lt;br /&gt;
Să se afișeze cuvintele pe ecran, fiecare cuvânt pe câte o linie, în ordinea descrescătoare a numărului de litere. Dacă două cuvinte au același număr de litere atunci ele se vor afișa în ordine lexicografică.&lt;br /&gt;
&lt;br /&gt;
== Tema ==&lt;br /&gt;
=== [https://www.pbinfo.ro/probleme/1866/prosir prosir]  ===&lt;br /&gt;
Să se înlocuiasca cu cifra 5 ultima literă a fiecărui cuvânt din textul conținut de fișierul prosir.in.&lt;br /&gt;
&lt;br /&gt;
=== #1456Cuvant  ===&lt;br /&gt;
Se consideră un cuvânt format din cel puțin două și cel mult 100 de caractere, numai litere mici ale alfabetului englez.&lt;br /&gt;
Scrieţi un program care citeşte de la tastatură un cuvânt de tipul precizat și afișează pe ecran mesajul DA în cazul în care cuvântul conține doar consoane şi, eventual, vocala i, sau mesajul NU în caz contrar.&lt;br /&gt;
&lt;br /&gt;
=== #890 NrVocale  ===&lt;br /&gt;
Se dă o propoziție formată din litere mari și mici ale alfabetului englez, cifre, spații și semne de punctuație, în care literele mari și mici se consideră identice. Determinați vocala din șir cu număr maxim de apariții.&lt;br /&gt;
&lt;br /&gt;
=== #13 Prefixe  ===&lt;br /&gt;
Să se scrie un program care să afişeze prefixele şi sufixele unui cuvânt citit.&lt;br /&gt;
&lt;br /&gt;
Avand in vedere ca vom avea nevoie sa memoram sirul de caractere, putem sa citim tot sirul utilizand o functie de citire sir. &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== #84 InterschimbareLitere  ===&lt;br /&gt;
Să se scrie un program care citește un cuvânt și îl afișează după interschimbarea primei vocale cu ultima consoană.&lt;br /&gt;
&lt;br /&gt;
=== #85 InserareAsterisc  ===&lt;br /&gt;
Să se scrie un program care citește un text și inserează după fiecare vocală caracterul *.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia15&amp;diff=18135</id>
		<title>10 2018 Lectia15</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia15&amp;diff=18135"/>
		<updated>2021-10-12T14:56:48Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Tema */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Structuri de date elementare =&lt;br /&gt;
Stivele şi cozile sunt mulţimi dinamice în care elementul care este eliminat din mulţime de către operaţia Şterge este prespecificat. Într-o stivă, elementul şters din mulţime este elementul cel mai recent inserat: stiva implementează principiul ultimul sosit, primul servit (last-in, first-out) prescurtat LIFO. Similar, într-o coadă, elementul şters este întotdeauna cel care a stat în mulţime cel mai mult (primul introdus): coada implementează principiul primul sosit, primul servit (first-in, first-out) sau FIFO. Există mai multe modalităţi eficiente de a implementa stivele şi cozile cu ajutorul calculatorului. Aici vom arăta cum se pot folosi tablourile simple pentru a implementa fiecare dintre aceste structuri.&lt;br /&gt;
== Stive ==&lt;br /&gt;
Operaţia Inserează asupra stivelor este deseori denumită Pune-În-Stivă ( &#039;&#039;&#039;Push&#039;&#039;&#039; ).&lt;br /&gt;
Operaţia Şterge, care nu cere nici un argument, este deseori numită Scoate-Din-Stivă ( &#039;&#039;&#039;Pop&#039;&#039;&#039; ). &lt;br /&gt;
Aceste nume sunt aluzii la stivele fizice, ca de exemplu un vraf de farfurii. Ordinea în care sunt luate farfuriile din vraf este ordinea inversă în care au fost introduse în vraf, deoarece doar ultima farfurie este accesibilă.&lt;br /&gt;
O stivă cu cel mult &#039;&#039;&#039;n&#039;&#039;&#039; elemente poate fi implementată printr-un tablou &#039;&#039;&#039;st[0..n-1]&#039;&#039;&#039;. &lt;br /&gt;
Tabloul are un atribut &#039;&#039;&#039;vf&#039;&#039;&#039; care este indicele noii locatii in care se va insera un nou element. &lt;br /&gt;
Stiva constă din elementele st[0..vf-1], unde st[0] este elementul de la baza stivei, iar st[vf-1] este elementul din vârful stivei, ultimul element al stivei.&lt;br /&gt;
Când vf = 0, stiva nu conţine nici un element şi deci este vidă. Se poate testa dacă stiva este vidă prin operaţia de interogare Stivă-Vidă&#039;&#039;&#039;( empty ) &#039;&#039;&#039;. Dacă se încearcă extragerea (se apelează operaţia Scoate-Din-Stivă) unui element dintr-o stivă vidă, spunem că stiva are depăşire inferioară, care în mod normal este o eroare. Dacă vf depăşeşte valoarea n, stiva are depăşire superioară. (În implementarea noastră nu ne vom pune problema depăşirii stivei.) Fiecare dintre operaţiile stivei pot fi implementate prin doar câteva linii de cod.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int st[100], int vf;&lt;br /&gt;
bool Stiva_Vida( ){&lt;br /&gt;
  if ( vf == 0 )&lt;br /&gt;
    return true;&lt;br /&gt;
  return false;&lt;br /&gt;
}&lt;br /&gt;
void Push ( int x ){&lt;br /&gt;
  st[vf++] = x;&lt;br /&gt;
}&lt;br /&gt;
int Pop ( ){&lt;br /&gt;
  if ( Stiva_Vida () ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;nu avem elem in stiva, depasire inferioara&amp;quot;;&lt;br /&gt;
    return -1;&lt;br /&gt;
  }&lt;br /&gt;
  vf --;&lt;br /&gt;
  return st[vf];&lt;br /&gt;
}&lt;br /&gt;
Fiecare dintre cele trei operaţii asupra stivelor necesită un timp O(1).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aplicatii cu Stive == &lt;br /&gt;
===[https://www.pbinfo.ro/probleme/875/stiva stiva] ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int kMax = 1000;&lt;br /&gt;
&lt;br /&gt;
int stk[kMax + 1];&lt;br /&gt;
int k = 0;&lt;br /&gt;
&lt;br /&gt;
// Verifica daca stiva este vida&lt;br /&gt;
bool empty() {&lt;br /&gt;
    if (k == 0) {&lt;br /&gt;
        return true;&lt;br /&gt;
    } else {&lt;br /&gt;
        return false;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Adauga element in stiva&lt;br /&gt;
void push(int x) {&lt;br /&gt;
    stk[k] = x;&lt;br /&gt;
    k++;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Afiseaza varful stivei&lt;br /&gt;
void top() {&lt;br /&gt;
    if (!empty()) {&lt;br /&gt;
        cout &amp;lt;&amp;lt; stk[k - 1] &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Sterge varful stivei&lt;br /&gt;
void pop() {&lt;br /&gt;
    if (!empty()) {&lt;br /&gt;
        k--;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n;&lt;br /&gt;
&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; i++) {&lt;br /&gt;
        char s[10];&lt;br /&gt;
        // citeste un cuvant pana la primul spatiu (sau tab sau enter)&lt;br /&gt;
        cin &amp;gt;&amp;gt; s;&lt;br /&gt;
&lt;br /&gt;
        if (s[0] == &#039;t&#039;) {&lt;br /&gt;
            // operatia &amp;quot;top&amp;quot;&lt;br /&gt;
            top();&lt;br /&gt;
        } else if (s[1] == &#039;o&#039;) {&lt;br /&gt;
            // operatia &amp;quot;pop&amp;quot;&lt;br /&gt;
            pop();&lt;br /&gt;
        } else {&lt;br /&gt;
            // operatia &amp;quot;push x&amp;quot;&lt;br /&gt;
            int x;&lt;br /&gt;
            cin &amp;gt;&amp;gt; x;&lt;br /&gt;
            push(x);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/848/paranteze1 paranteze1] ===&lt;br /&gt;
Se dau n șiruri de paranteze rotunde. Să se stabilească, despre fiecare șir, dacă este corect parantezat – adică dacă parantezele se închid corect.&lt;br /&gt;
Un șir de paranteze S rotunde este corect parantezat dacă:&lt;br /&gt;
* S este șirul vid, sau&lt;br /&gt;
* S = (T) și T este corect parantezat, sau&lt;br /&gt;
* S = AB, iar A și B sunt corect parantezate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin( &amp;quot;paranteze1.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;paranteze1.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n;&lt;br /&gt;
    char st[255], c;&lt;br /&gt;
    fin &amp;gt;&amp;gt; n;&lt;br /&gt;
    fin.get( c );&lt;br /&gt;
    for ( int i = 0; i &amp;lt; n; i ++ ) {&lt;br /&gt;
      int k = 0;&lt;br /&gt;
      c = fin.get( );&lt;br /&gt;
      while ( c != &#039;\n&#039; &amp;amp;&amp;amp; c!= EOF ) {&lt;br /&gt;
        if ( k &amp;amp;&amp;amp; st[k-1] == &#039;(&#039; &amp;amp;&amp;amp; c == &#039;)&#039; )&lt;br /&gt;
          k --;&lt;br /&gt;
        else {&lt;br /&gt;
          st[k++] = c;&lt;br /&gt;
        }&lt;br /&gt;
        c = fin.get( );&lt;br /&gt;
      }&lt;br /&gt;
      fout &amp;lt;&amp;lt; ( k == 0 ) &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Cozi ==&lt;br /&gt;
Vom numi Pune-În-Coadă ( Push ) operaţia de inserare aplicată asupra unei cozi, iar operaţia de stergere o vom numi Scoate-Din-Coadă ( Pop ); asemănător operaţiei Scoate-Din-Stivă aplicată stivei, Scoate-Din-Coadă nu necesită nici un argument. &lt;br /&gt;
Principiul FIFO, propriu cozii, impune ca aceasta să opereze asemănător cu un rând de oameni ce aşteaptă la un ghişeu. Coada are un cap şi o coadă. Când un element este pus în coadă, ocupă locul de la sfârşitul cozii, ca şi un nou venit ce îşi ia locul la coada rândului. Elementul scos din coadă este întotdeauna cel din capul cozii, asemănător persoanei din capul rândului care a aşteptat cel mai mult. &lt;br /&gt;
O modalitate de a implementa o coadă având cel mult n − 1 elemente, foloseste un tablou Q[0..n-1]. &lt;br /&gt;
Coada are un atribut &#039;&#039;&#039;in&#039;&#039;&#039;, capul cozii, care conţine indicele capului ei si un atributul &#039;&#039;&#039;sf&#039;&#039;&#039;, sfarsitul cozii, ce conţine indicele noii locaţii în care se va insera în coadă elementul nou venit. &lt;br /&gt;
Elementele din coadă se află în locaţiile cap, cap + 1, ..., coada − 1, iar indicii se parcurg circular, în sensul că locaţia 0 urmează imediat după locaţia n-1. Când cap = coada, coada este goală.&lt;br /&gt;
Iniţial avem in = sf = 0. Când coada este vidă, o încercare de a scoate un element din coadă cauzează o depăşire inferioară în coadă. Când cap = coada + 1, coada este “plină” şi o încercare de a pune în coadă cauzează o depăşire superioară în coadă.&lt;br /&gt;
În Pune-În-Coadă şi Scoate-Din-Coadă, verificarea erorilor de depăşire inferioară a fost omisă. &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
const int NMAX = 100;&lt;br /&gt;
int Q[NMAX], in, sf;&lt;br /&gt;
&lt;br /&gt;
void Push ( int x ){&lt;br /&gt;
  Q[sf] = x;&lt;br /&gt;
  sf = (sf + 1 ) % NMAX;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int Pop () {&lt;br /&gt;
  int x = Q[in];&lt;br /&gt;
  in = ( int + 1 ) % NMAX;&lt;br /&gt;
  return x;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Exercitii ==&lt;br /&gt;
*  Explicaţi cum se pot implementa două stive într-un singur tablou astfel încât nici una dintre stive să nu aibă depăşire superioară, cu excepţia cazului în care numărul total de elemente din ambele stive (împreună) este n. Operaţiile Pune-În-Stivă şi Scoate-Din-Stivă trebuie să funcţioneze într-un timp O(1).&lt;br /&gt;
* Rescrieţi Pune-În-Coadă şi Scoate-Din-Coadă pentru a detecta depăşirile unei cozi.&lt;br /&gt;
* În timp ce stiva permite inserarea şi ştergerea de elemente doar la un singur capăt, iar coada permite inserarea la un capăt şi ştergerea la celălalt capăt, o coadă completă permite&lt;br /&gt;
inserări şi ştergeri la ambele capete. Scrieţi patru proceduri cu timpul de execuţie O(1) pentru&lt;br /&gt;
inserare de elemente şi ştergere de elemente la ambele capete ale unei cozi complete implementată&lt;br /&gt;
printr-un tablou.&lt;br /&gt;
* Arătaţi cum se poate implementa o coadă prin două stive. Analizaţi timpul de execuţie pentru operaţiile cozii.&lt;br /&gt;
* Arătaţi cum se poate implementa o stivă prin două cozi. Analizaţi timpul de execuţie pentru operaţiile stivei.&lt;br /&gt;
&lt;br /&gt;
= Tema Stiva =&lt;br /&gt;
Probleme Pbinfo din runda:&lt;br /&gt;
ecuatie1 , Stiva , Cuburi2 , Depou , Paranteze1 , Paranteze4 , Paranteze3 , Paranteze2 , minlex , eval_exp , eval_exp2&lt;br /&gt;
&lt;br /&gt;
Probleme Varena&lt;br /&gt;
* [http://varena.ro/problema/bile2 bile2] dată la concursul .campion 2005&lt;br /&gt;
* [http://varena.ro/problema/turn turn] dată la ONI 2007 clasa a 6&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [http://varena.ro/problema/paranteze1 paranteze1] dată ca temă la cercul IQ Academy 2018 clasa a 6&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [http://varena.ro/problema/swap swap] dată la ONI 2013 baraj gimnaziu&lt;br /&gt;
&lt;br /&gt;
Probleme Infoarena&lt;br /&gt;
* [http://infoarena.ro/problema/editor editor]&lt;br /&gt;
* [http://infoarena.ro/problema/trompeta trompeta]&lt;br /&gt;
GREA&lt;br /&gt;
* [http://infoarena.ro/problema/identice identice]&lt;br /&gt;
&lt;br /&gt;
= Bibliografie =&lt;br /&gt;
* Introducere in algoritmi, Thomas Cormen&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Tmp_cerc_6&amp;diff=18132</id>
		<title>Tmp cerc 6</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Tmp_cerc_6&amp;diff=18132"/>
		<updated>2021-10-05T12:19:05Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lecție =&lt;br /&gt;
&lt;br /&gt;
== Reprezentarea în memorie a valorilor întregi ==&lt;br /&gt;
&lt;br /&gt;
Valorile întregi se reprezintă în memorie ca o secvență de biți (cifre binare, 0 și 1). Acestă secvență poate avea 8, 16, 32 sau 64 de biți. &lt;br /&gt;
Reprezentarea în memorie a datelor de tip întreg se face în mod similar pentru toate tipurile cu semn (char, short int, int, long long int) și similar pentru toate tipurile fără semn (unsigned char, unsigned short int, unsigned int, unsigned long long int).&lt;br /&gt;
În exemplele care urmează vom folosi tipurile reprezentate pe 16 biți: unsigned short int, respectiv short int.&lt;br /&gt;
Reprezentarea în memorie a valorilor de tip unsigned short int&lt;br /&gt;
Tipul unsigned short int memorează valori mai mari sau egale cu 0. Acestea se reprezintă în memorie astfel:&lt;br /&gt;
* se transformă numărul în baza 2 și se memorează, adăugând la început cifre de 0 nesemnificative, atâtea câte sunt necesare până la completarea celor 16 biți.&lt;br /&gt;
* dacă reprezentarea în baza 2 a numărului are mai mult de 16 cifre, se vor memora numai ultimele 16 cifre – numărul se va trunchia.&lt;br /&gt;
Astfel, valorile fără semn care se pot reprezenta pe 16 biți sunt cuprinse între 0 și 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;-1, adică 0 și 65535.&lt;br /&gt;
 0 se reprezintă     0000000000000000&lt;br /&gt;
 65535 se reprezintă 1111111111111111&lt;br /&gt;
 5 se reprezintă     0000000000000101&lt;br /&gt;
 133 se reprezintă   0000000010000101&lt;br /&gt;
Reprezentarea în memorie a valorilor de tip short int&lt;br /&gt;
Tipul short int memorează atât valori pozitive, cât și valori negative. Astfel, dintre cei 16 biți disponibili, cel mai din dreapta (numit bit de semn) stabilește semnul numărului. Dacă acest bit este 0, numărul este pozitiv, dacă acest bit este 1, numărul este negativ. Astfel, se pot memora 32768 valori negative, de la -32768 la -1, și 32768 pozitive sau zero, de la 0 la 32767.&lt;br /&gt;
Modalitatea de reprezentarea în memorie a întregilor se numește cod complementar.&lt;br /&gt;
Reprezentarea numerelor pozitive se face exact ca mai sus: se transformă numărul în baza 2 și se completează cu zerouri nesemnificative. Nu la fel se face reprezentarea numerelor întregi negative. Această reprezentare se face conform pașilor următori:&lt;br /&gt;
se determină reprezentarea în memorie a numărului ce reprezintă valoarea absolută a numărului inițial. Aceasta are bitul de semn 0.&lt;br /&gt;
se determină complementul față de 1 a reprezentării de la pasul anterior – fiecare bit 1 devine 0 și fiecare bit 0 devine 1.&lt;br /&gt;
se adună 1 la valoarea obținută&lt;br /&gt;
De exemplu, pentru reprezentarea în memorie a numărului -133 (considerat de tip short int) se procedează astfel:&lt;br /&gt;
 se determină reprezentarea în memorie a lui 133&lt;br /&gt;
 se obține complementul față de 1&lt;br /&gt;
 se adună 1 și se obține:&lt;br /&gt;
 0000000010000101&lt;br /&gt;
 1111111101111010&lt;br /&gt;
 1111111101111011&lt;br /&gt;
Mecanismul de memorare numerelor este același pentru toate tipurile întregi. Diferă numai numărul de biți folosiți pentru reprezentare și implicit intervalul din care fac parte valorile reprezentate.&lt;br /&gt;
&lt;br /&gt;
== Operatori logici pe biti ==&lt;br /&gt;
Operatorii la nivel de bit se aplica fiecărui bit din reprezentarea operanzilor întregi, spre deosebire de restul operatorilor care se aplică valorilor operanzilor.&lt;br /&gt;
&lt;br /&gt;
Din această categorie fac parte operatorii următori, care apar in ordinea descrescatoare a priorității:&lt;br /&gt;
&lt;br /&gt;
====  Negaţia pe biţi &#039;&#039;&#039;~&#039;&#039;&#039; ====&lt;br /&gt;
Acest operator are ca efect schimbarea biților unui număr din 0 in 1 si din 1 in 0.&lt;br /&gt;
&lt;br /&gt;
====  Deplasarea la stânga/ la dreapta pe biți &#039;&#039;&#039;&amp;lt;&amp;lt;, &amp;gt;&amp;gt;&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Expresia &#039;&#039;&#039;x &amp;lt;&amp;lt; i&#039;&#039;&#039; este echivalentă cu expresia x * 2&amp;lt;sup&amp;gt;i&amp;lt;/sup&amp;gt;. Are ca efect eliminarea celor mai din stânga i biţi ai lui x şi adaugarea la dreapta i biţi de 0. &lt;br /&gt;
De exemplu, dacă x = 1110&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt;, atunci x &amp;lt;&amp;lt; 2 înseamnă 111000&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 56 (adică 14 * 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
* Expresia &#039;&#039;&#039;x &amp;gt;&amp;gt; i&#039;&#039;&#039; este echivalentă cu x div 2&amp;lt;sup&amp;gt;i&amp;lt;/sup&amp;gt; . Operatorul de deplasare la dreapta elimină cei mai din dreapta i biţi ai lui x şi adaugă la stânga i biţi de 0. &lt;br /&gt;
De exemplu, dacă x = 1110&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt;, atunci x &amp;gt;&amp;gt; 2 înseamnă 0011&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 3 (adică 14 div 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Si pe biţi &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039;====&lt;br /&gt;
 n1  1010 &amp;amp; &lt;br /&gt;
 n2  1011 = &lt;br /&gt;
 rez 1010&lt;br /&gt;
&lt;br /&gt;
==== Sau exclusiv pe biţi (xor) &#039;&#039;&#039;^&#039;&#039;&#039;====&lt;br /&gt;
 n1  1010 ^ &lt;br /&gt;
 n2  1011  &lt;br /&gt;
 rez 0001 &lt;br /&gt;
==== Sau pe biţi &#039;&#039;&#039;|&#039;&#039;&#039;====&lt;br /&gt;
 n1  1010 | &lt;br /&gt;
 n2  1011  &lt;br /&gt;
 rez 1011 &lt;br /&gt;
&lt;br /&gt;
== Prioritatea operatorilor ( precedenta operatorilor ) ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;width:11.038cm;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#dee7ec;border:none;padding:0cm;&amp;quot;&lt;br /&gt;
|| &#039;&#039;&#039;Operator &#039;&#039;&#039;&lt;br /&gt;
| align=center| &#039;&#039;&#039;Descriere &#039;&#039;&#039;&lt;br /&gt;
| align=center| &#039;&#039;&#039;Asociativitate &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;~&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Complement faţă de 1 pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;lt;&amp;lt; si &amp;gt;&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Deplasare stânga/dreapta a biţilor &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | ŞI pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;^&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | SAU-EXCLUSIV pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;|&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | SAU pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;amp;=&#039;&#039;&#039; și &#039;&#039;&#039;|=&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Atribuire cu ŞI/SAU &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;^=&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Atribuire cu SAU-EXCLUSIV &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;lt;&amp;lt;=&#039;&#039;&#039; şi &#039;&#039;&#039;&amp;gt;&amp;gt;=&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Atribuire cu deplasare de biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Aplicații ale operatorilor pe biţi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Inmultirea cu 2===&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se afişeze valoarea &#039;&#039;&#039;2*k&#039;&#039;&#039;.&lt;br /&gt;
Vom folosi operatorul de deplasare la stânga pe biţi: n &amp;lt;&amp;lt; 1. Deci secvenţa va fi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(n &amp;lt;&amp;lt; 1) ;    //echivalent cu n = n * 2;&lt;br /&gt;
x = 1 &amp;lt;&amp;lt; 2;         100 = 4 = 2^2&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// vectorii x si s vor fi declarati global asa ca nu ne vor trebui parametri in functie&lt;br /&gt;
void scadere()&lt;br /&gt;
{ int i,j;&lt;br /&gt;
for (i = 1; i &amp;lt;= x[0]; i++)&lt;br /&gt;
        if(x[i]&amp;gt;=y[i])&lt;br /&gt;
            x[i]-=y[i];&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            j=i+1;&lt;br /&gt;
            while(x[j]==0)&lt;br /&gt;
                x[j++]=9;&lt;br /&gt;
            x[j]--;&lt;br /&gt;
            x[i]=10+x[i]-y[i];&lt;br /&gt;
        }&lt;br /&gt;
    while(x[x[0]]==0)&lt;br /&gt;
        x[0]--;//nu vom afisa si zerourile de la inceput&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Catul impartirii la 2===&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se afişeze valoarea &#039;&#039;&#039;n/2&#039;&#039;&#039;.&lt;br /&gt;
Vom folosi operatorul de deplasare la stânga pe biţi: n &amp;gt;&amp;gt; 1. Deci secvenţa va fi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(n &amp;gt;&amp;gt; 1) ;   //echivalent cu n = n / 2; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Restul impartirii la 2===&lt;br /&gt;
&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se afişeze valoarea &#039;&#039;&#039;n % 2&#039;&#039;&#039;.&lt;br /&gt;
Vom aplica operatorul &amp;amp; între n si numărul 1 (numărul 1 joacă rol de mască). Aceasta masca are primii biţi 0 si ultimul bit 1. Astfel incat dacă n &amp;amp; 1 va avea ca efect extragerea ultimei cifre binare a lui n. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(n &amp;amp; 1) ;   //echivalent cu n = n % 2; catul impartirii la 2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verificarea parității ===&lt;br /&gt;
Se consideră un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se verifice dacă &#039;&#039;&#039;n&#039;&#039;&#039; este par sau impar.&lt;br /&gt;
&lt;br /&gt;
Ex1: pentru n este impar, avem ultima cifra binara 1. De exemplu, n = 13 se scrie în baza 2 ca 1101. Atunci &lt;br /&gt;
 1101 &amp;amp; &lt;br /&gt;
 0001 =&lt;br /&gt;
 0001&lt;br /&gt;
Ex2: pentru n este par, avem ultima cifra binara 0. De exemplu, n = 14 se scrie în baza 2 ca 1110.Atunci &lt;br /&gt;
 1110 &amp;amp; &lt;br /&gt;
 0001 = &lt;br /&gt;
 0000 &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
if (( n &amp;amp; 1 ) == 1) printf( &amp;quot;Numar impar&amp;quot; );&lt;br /&gt;
else cout &amp;lt;&amp;lt; printf(&amp;quot;Numar par&amp;quot;) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ATENȚIE! operatorul &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039;, ca si operatorii &#039;&#039;&#039;^&#039;&#039;&#039; si &#039;&#039;&#039;|&#039;&#039;&#039;, are prioritate mai mica decat operatorul &#039;&#039;&#039;==&#039;&#039;&#039;, de aceea este necesara utilizarea parantezelor pentru a da prioritate operatorului &amp;amp; în expresia instrucţiunii if. ( Expresia n &amp;amp; 1 == 1 este interpretată de compilator ca fiind n &amp;amp; (1 == 1) )&lt;br /&gt;
&lt;br /&gt;
===2 la puterea k ===&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;k&#039;&#039;&#039; &amp;lt;= 15. Să se afişeze valoarea &#039;&#039;&#039;2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
Vom folosi operatorul de deplasare la stânga pe biţi: 1 &amp;lt;&amp;lt; k. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;k);&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, 1 &amp;lt;&amp;lt; k) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Câtul și restul împărțirii lui n la 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
Se consideră un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se determine câtul şi restul împărţirii lui n la un număr &#039;&#039;&#039;m&#039;&#039;&#039; de forma 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Împărțirea unui număr zecimal la o putere a lui 10 are ca efect împărțirea numarului zecimal in 2 părți: câtul și restul impărțirii numarului la puterea lui 10. Similar, împărțirea unui număr la o putere a lui 2, separă reprezentarea binara a acestuia de asemenea în 2 zone: câtul și restul impărțirii numarului la puterea lui 2.&lt;br /&gt;
&lt;br /&gt;
Ex: pentru numarul : 12345 prin impărțire la 100 separăm numarul in 2:  &amp;lt;span style=&amp;quot;background:yellowgreen&amp;quot;&amp;gt;123&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;background:LightSeaGreen&amp;quot;&amp;gt;45&amp;lt;/span&amp;gt;; 123 = n div 100, 45 = n mod 100.&lt;br /&gt;
&lt;br /&gt;
Similar pentru reprezentarea binara:&lt;br /&gt;
&lt;br /&gt;
n = 20 = &amp;lt;span style=&amp;quot;background:yellowgreen&amp;quot;&amp;gt;101&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;background:LightSeaGreen&amp;quot;&amp;gt;00&amp;lt;/span&amp;gt;&lt;br /&gt;
n div 4 = 101 &amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 5 &amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&lt;br /&gt;
n mod 4 = 00 &amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 0 &amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putem să obținem aceleași rezultate și prin folosirea operațiilor pe biți.&lt;br /&gt;
Pentru aflarea câtului vom folosi operatorul de deplasare pe biți. Trebuie însă să îl știm pe k = puterea lui 2.&lt;br /&gt;
&lt;br /&gt;
Pentru rest se utilizează expresia n &amp;amp; (m-1) , deoarece m-1  are toti biții 1, m-1 si in acest fel extragem doar ultimii m-1 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(&amp;quot;Catul este : %d&amp;quot;, n &amp;gt;&amp;gt; k ) ;&lt;br /&gt;
printf(&amp;quot;Restul este : %d&amp;quot;, (n &amp;amp; (m-1) ) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ex:&lt;br /&gt;
20 div 4 = 20 &amp;gt;&amp;gt; 2 = 5&lt;br /&gt;
&lt;br /&gt;
 10100 &lt;br /&gt;
   &amp;gt;&amp;gt;2=&lt;br /&gt;
 00101&lt;br /&gt;
&lt;br /&gt;
20 mod 4 = 20 &amp;amp; 3 = 0&lt;br /&gt;
&lt;br /&gt;
 10100 &amp;amp;&lt;br /&gt;
 00011=&lt;br /&gt;
 00000&lt;br /&gt;
&lt;br /&gt;
===Verificare daca n este o putere a lui 2===&lt;br /&gt;
Se consideră un număr natural n. Să se verifice dacă n este sau nu o putere a lui 2.&lt;br /&gt;
Rezolvare: Acesta este o problemă destul de cunoscută. Dacă n este o putere a lui 2, atunci reprezentarea sa în baza 2 are un singur bit 1, restul fiind 0. Ceea ce inseamna ca daca vom incerca sa eliminam ultimul bit semnificativ de 1, folosind masca ( n-1 ) va trebui sa obtinem valoarea 0. &lt;br /&gt;
 &lt;br /&gt;
( Dacă n este o putere a lui 2, este de forma 0000000000100000, atunci n-1 are reprezentarea de forma 0000000000011111, adică bitul 1 s-a transformat în 0, iar biţii de la dreapta sunt acum toţi 1. Deci o expresie de forma n &amp;amp; (n-1) va furniza rezultatul 0 dacă şi numai dacă n este o putere a lui 2. )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
scanf ( &amp;quot;%d&amp;quot;, &amp;amp;n) ;&lt;br /&gt;
if ( (n &amp;amp; (n-1)) == 0 ) &lt;br /&gt;
  printf( &amp;quot;n este putere a lui 2&amp;quot; );&lt;br /&gt;
else &lt;br /&gt;
  printf( &amp;quot;n nu este putere a lui 2&amp;quot;) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Numararea bitilor de 1 din scrierea binară a unui număr n ===&lt;br /&gt;
&lt;br /&gt;
Rezolvarea naivă a acestei probleme ar consta în parcurgerea secvenţială a biţilor lui n. În continuare vă prezint această rezolvare:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int count(long n) {&lt;br /&gt;
    int num = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; 32; i++)&lt;br /&gt;
        if (n &amp;amp; (1 &amp;lt;&amp;lt; i)) num++;&lt;br /&gt;
    return num;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Dacă ne uităm cu atenţie şi analizăm rezultatul operaţiei n &amp;amp; (n - 1) putem obţine o soluţie mai bună. Să luăm un exemplu:&lt;br /&gt;
&lt;br /&gt;
 11011101010000 = n&lt;br /&gt;
 11011101001111 = n - 1&lt;br /&gt;
 11011101000000 = n &amp;amp; (n - 1)&lt;br /&gt;
&lt;br /&gt;
Se vede clar de aici că efectul operaţiei n &amp;amp; (n - 1) este anularea celui mai nesemnificativ bit cu valoarea 1.&lt;br /&gt;
&lt;br /&gt;
De aici ideea algoritmului:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int count(long n) {&lt;br /&gt;
    int num = 0;&lt;br /&gt;
    if (n)&lt;br /&gt;
        do num++; while (n &amp;amp;= n - 1);&lt;br /&gt;
    return num;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Transformarea unui bit în 1 ===&lt;br /&gt;
 &lt;br /&gt;
Pornim de la valoarea întreagă n = 50. Reprezentarea acestuia pe 8 biti este 00110010. Presupunem că dorim setarea bitului 2 la valoarea 1. Pentru aceasta vom folosi o mască logică în care doar bitul 2 este 1 restul bitilor fiind 0, adică M = 00000100. Pentru a obtine valoarea lui M vom deplasa valoarea 1 cu spre 2 biti spre stanga. Aplicand operatia de de disjunctie &amp;quot;SAU pe biti&amp;quot; aplicată asupra lui n şi a lui M, conduce la obtinerea rezultatului dorit. &lt;br /&gt;
 &lt;br /&gt;
 n   00110010 |&lt;br /&gt;
 M   00000100  &lt;br /&gt;
 Rez 00110110 &lt;br /&gt;
 &lt;br /&gt;
Generalizând, dacă se doreşte ca valorii n, să i se seteze la valoarea 1, bitul B (0≤B≤7), atunci vom avea:&lt;br /&gt;
 n = n | (1 &amp;lt;&amp;lt; B)&lt;br /&gt;
&lt;br /&gt;
=== Transformarea unui bit în 0 ===&lt;br /&gt;
 &lt;br /&gt;
Să luăm ca exemplu n= 109, pentru a vedea cum se setează un bit la valoarea 0. Reprezentarea internă a lui este 01101101. Se cere să se seteze bitul 5 la valoarea 0. De data aceasta masca va conŃine toti bitii de 1, exceptie bitul 5. Aspura lui n şi M vom aplica ŞI logic.  &lt;br /&gt;
 &lt;br /&gt;
 n    01101101 &amp;amp;  &lt;br /&gt;
 M    11011111  &lt;br /&gt;
 Rez  01001101 &lt;br /&gt;
&lt;br /&gt;
Presupunem că dorim să setăm la 0 valoarea bitului B (0≤B≤7).  &lt;br /&gt;
 n = n &amp;amp; ~(1 &amp;lt;&amp;lt; B)&lt;br /&gt;
&lt;br /&gt;
=== Testarea valorii unui bit ===&lt;br /&gt;
Plecăm de la valoarea n = 47. Reprezentarea internă a lui este 00101111. Presupunem că dorim să cunoaştem valoarea bitului 3 şi bitului 6. Vom folosi măştile M1=00001000 şi M2=01000000. Vom aplica de fiecare dată ŞI logic între n şi cele două măşti: &lt;br /&gt;
 &lt;br /&gt;
 n   00101111 &amp;amp;  &lt;br /&gt;
 M1  00001000  &lt;br /&gt;
 Rez 00001000 &lt;br /&gt;
Respectiv  &lt;br /&gt;
 n   00101111 &amp;amp;  &lt;br /&gt;
 M2  01000000  &lt;br /&gt;
 Rez 00000000 &lt;br /&gt;
&lt;br /&gt;
Generalizând, testarea se va realiza prin : &lt;br /&gt;
n &amp;amp; ( 1 &amp;lt;&amp;lt; B )&lt;br /&gt;
&lt;br /&gt;
===Testarea valorilor ultimilor biti ===&lt;br /&gt;
 &lt;br /&gt;
Pornim de la valoarea întreagă n=50. Reprezentarea acestuia pe 8 biti este 00110010. Presupunem că dorim să cunoaştem restul la împărtirea întreagă a lui n la 8, adică n%8. Valoarea ultimilor 3 biti din reprezentarea internă a lui, reprezintă tocmai acest rest. Pentru aceasta vom folosi o mască în care ultimii trei bitii sunt 1 restul 0. Aceasta mască are valoarea 7, adică 00000111. Vom aplica operatia ŞI logic. &lt;br /&gt;
 &lt;br /&gt;
 n   00110010 &amp;amp;  &lt;br /&gt;
 M   00000111  &lt;br /&gt;
 Rez 00000010 &lt;br /&gt;
 &lt;br /&gt;
Pe caz general, dacă dorim să cunoaştem valoarea ultimilor B biti (care este egal cu restul împărtirii lui X la 2B) vom exprima astfel: &lt;br /&gt;
 &lt;br /&gt;
 n &amp;amp; (1 &amp;lt;&amp;lt; B–1)&lt;br /&gt;
&lt;br /&gt;
===Scrierea numarului n in baza 2===&lt;br /&gt;
???Se consideră un număr natural n. Să se afişeze reprezentarea lui n în baza 2.&lt;br /&gt;
Rezolvare: Ne bazăm pe faptul că în memorie n este deja reprezentat în baza 2, deci trebuie să-i afişăm biţii de la stânga la dreapta. Presupunând că n este reprezentat pe 16 biţi, pe aceştia îi numerotăm de la dreapta la stânga cu numere de la 0 la 15. Pentru a obţine bitul de pe poziţia i (0 &amp;lt;= i &amp;lt;= 15), utilizăm expresia (n &amp;gt;&amp;gt; i) &amp;amp; 1. Nu rămâne decât să utilizăm expresia pentru fiecare i între 0 şi 15.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cin &amp;gt;&amp;gt; n ;&lt;br /&gt;
for (int I = 15 ; i &amp;gt;= 0 ; i--)&lt;br /&gt;
   cout &amp;lt;&amp;lt; ((n &amp;gt;&amp;gt; i) &amp;amp; 1) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Memorarea a doi intregi &amp;lt;255 intr-o singura locatie de memorie ===&lt;br /&gt;
Se consideră două numere naturale a şi b, ambele cuprinse între 0 şi 255. Se cere să se memoreze cele două numere într-un întreg n reprezentabil pe 16 biţi fără semn (deci de tip unsigned short).&lt;br /&gt;
Rezolvare: Cele două numere a şi b pot fi reprezentate pe 8 biţi. De aceea cei 16 biţi ai lui n sunt suficienţi. Stocăm a pe primii 8 biţi ai lui n, iar pe b pe ultimii 8 biţi ai lui n. n = a * 256 + b ; De asemenea, dacă se cunoaşte n, se pot obţine valorile lui a şi b astfel: a = n &amp;gt;&amp;gt; 8 ; // sau a = n / 256&lt;br /&gt;
b = n &amp;amp; 255 ; // sau b = n % 256 ;&lt;br /&gt;
&lt;br /&gt;
===Codificare/decodificare=== &lt;br /&gt;
Considerăm un număr pe care dorim să-l codificăm, apoi să-l decodificăm.&lt;br /&gt;
Rezolvare: O modalitate simplă de codificare şi decodificare este utilizarea operatorului pe biţi XOR. Pentru aceasta considerăm o mască (o parolă) şi ne bazăm pe o proprietate interesantă a operatorului XOR: a ^ b ^ b = a. Deci a ^ b realizează codificarea lui a, iar (a ^ b) ^ b realizează decodificarea. Proprietatea se bazează pe faptul că b ^ b = 0, pentru orice b, iar a ^ 0 = a. Metoda poate fi aplicată şi pentru codificarea unui text utilizând o parolă dată. Cu ajutorul parolei aplicată peste textul iniţial se obţine codificarea, iar o a doua aplicare a parolei peste codificare se obţine textul iniţial. Secvenţa care realizează codificarea/decodificarea unui număr este:&lt;br /&gt;
int n, masca;&lt;br /&gt;
n = 65 ;&lt;br /&gt;
masca = 100 ;&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;\nValoarea initiala a lui n : &amp;quot; &amp;lt;&amp;lt; n ;&lt;br /&gt;
n = n ^ masca ;&lt;br /&gt;
cout&amp;lt;&amp;lt; &amp;quot;\nValoarea codificata a lui n : &amp;quot; &amp;lt;&amp;lt; n ;&lt;br /&gt;
n = n ^ masca ;&lt;br /&gt;
cout&amp;lt;&amp;lt; &amp;quot;\nValoarea decodificata a lui n : &amp;quot; &amp;lt;&amp;lt; n ;&lt;br /&gt;
&lt;br /&gt;
= TEMA =&lt;br /&gt;
* [http://varena.ro/problema/aparitii aparitii]&lt;br /&gt;
* [http://varena.ro/problema/paritate paritate]&lt;br /&gt;
Pentru o mai buna fixare a operatiilor pe biti, va sfatuiesc ca din cand in cand sa mai rezolvati cate o problema. Aveti aici cateva probleme:&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=keyword&amp;amp;action=view&amp;amp;id=45 Probleme de pe .campion]&lt;br /&gt;
* Implementati ciurul lui Eratostene pe biti&lt;br /&gt;
&lt;br /&gt;
== Multimi reprezentate pe biti == &lt;br /&gt;
===Sarcina 1===&lt;br /&gt;
O mulțime de numere întregi poate fi reprezentată astfel: spunem că un număr i aparține unei mulțimi S dacă bit-ul al i-lea din vectorul S are valoarea 1. Pentru eficientă, vectorul S va conține date de tipul unsigned char (reamintim ca sizeof(unsigned int) == 1 byte adică 8 biți). &lt;br /&gt;
Implementați următoarele funcții. Realizați un program în C prin care să demonstrați că funcțiile implementate funcționează. &lt;br /&gt;
Vom considera ca urmatoarele constante se aplica pe parcursul urmatoarelor exemple:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  const int MAXN = 1e4; // se seteaza dupa caz&lt;br /&gt;
  const int LOG_BYTE = 3;&lt;br /&gt;
  const int SIZE = (MAXN &amp;gt;&amp;gt; LOG_BYTE) + 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* adăugarea unui element în mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // insert_in_set(s, n) - adauga numarul n in multimea s &lt;br /&gt;
  void insert_in_set(char s[SIZE], unsigned int n) {&lt;br /&gt;
    s[n &amp;gt;&amp;gt; LOG_BYTE] |= (1 &amp;lt;&amp;lt; (n &amp;amp; ((1 &amp;lt;&amp;lt; LOG_BYTE) - 1)));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* ștergerea unui element din mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // delete_from_set(s, n) - scoate numarul n din multime s&lt;br /&gt;
  void delete_from_set(char s[SIZE], unsigned int n) {&lt;br /&gt;
    s[n &amp;gt;&amp;gt; LOG_BYTE] &amp;amp;= ~(1 &amp;lt;&amp;lt; (n &amp;amp; ((1 &amp;lt;&amp;lt; LOG_BYTE) - 1)));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* verificarea faptului că un element n aparține unei mulțimi&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // is_in_set(s, n) - returneaza 1 daca n este in s, 0 altfel&lt;br /&gt;
  int is_in_set(char s[SIZE], unsigned int n) {&lt;br /&gt;
    return (s[n &amp;gt;&amp;gt; LOG_BYTE] &amp;amp;= (1 &amp;lt;&amp;lt; (n &amp;amp; ((1 &amp;lt;&amp;lt; LOG_BYTE) - 1)))) &amp;gt; 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* ștergerea tuturor elementelor din mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // delete_all_from_set(s) - elimina toate elementele din multime&lt;br /&gt;
  void delete_all_from_set(char s[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE: ++i)&lt;br /&gt;
      s[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* calcularea cardinalul unei mulțimi&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  /// card_set(s) - returneaza cardinalul multimii s&lt;br /&gt;
  int card_set(char s[SIZE]) {&lt;br /&gt;
    int c = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i) {&lt;br /&gt;
      int aux = s[i];&lt;br /&gt;
      while (aux &amp;gt; 0) {&lt;br /&gt;
        aux &amp;amp;= (aux - 1);&lt;br /&gt;
        ++c;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return c;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* verificarea faptului că mulțimea este vidă&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // is_empty_set(s) - verifica daca multimea este sau nu goala&lt;br /&gt;
  // returneaza 1 daca este, 0 daca nu este&lt;br /&gt;
  int is_empty_set(char s[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      if (s[i])&lt;br /&gt;
        return 0;&lt;br /&gt;
    return 1;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* o funcție care să citească de la tastatură o mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // read_set(s) - functia citeste numarul n de elemente care se afla in s&lt;br /&gt;
  // apoi citeste cele n numere si le insereaza in a&lt;br /&gt;
  // va returna numarul n citit (numarul de elemente)&lt;br /&gt;
  int read_set(char s[SIZE]) {&lt;br /&gt;
    int n;&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
      int num;&lt;br /&gt;
      scanf(&amp;quot;%d&amp;quot;, &amp;amp;num);&lt;br /&gt;
      insert_in_set(s, num);&lt;br /&gt;
    }&lt;br /&gt;
    return n;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* o funcție care să afișeze pe ecran elementele care se află într-o mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // print_set(s) - functia printeaza elementele multimii s&lt;br /&gt;
  void print_set(char s[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; (SIZE &amp;lt;&amp;lt; LOG_BYTE); ++i)&lt;br /&gt;
      if (is_in_set(s, i))&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sarcina 2 ===&lt;br /&gt;
Realizati un program care, utilizând metodele de fite anterior, citește 2 mulțimi A (n și B și a fișează: &lt;br /&gt;
AUB,A∩B,A−B,B−A&lt;br /&gt;
AUB,A∩B,A−B,B−A&lt;br /&gt;
. &lt;br /&gt;
Pentru a realiza acest lucru, va trebui să implementați următoarele funcții: &lt;br /&gt;
* reuniunea a două mulțimi (1p)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // c = a U b&lt;br /&gt;
  void merge_set(char a[SIZE], char b[SIZE], char c[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      c[i] = (a[i] | b[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* intersecția a două mulțimi (1p)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // c = a n b&lt;br /&gt;
  void intersect_set(char a[SIZE], char b[SIZE], char c[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      c[i] = (a[i] &amp;amp; b[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* diferența a două mulțimi (1p)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // c = a \ b&lt;br /&gt;
  void diff_set(char a[SIZE], char b[SIZE], char c[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      c[i] = (a[i] ^ (a[i] &amp;amp; b[i]));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
În final va trebui sa creați o funcție main și să faceți un program care rezolvă cerința folosind funcțiile implementate.&lt;br /&gt;
&lt;br /&gt;
==Lista de probleme==&lt;br /&gt;
Probleme rezolvate:&lt;br /&gt;
&lt;br /&gt;
http://www.infoarena.ro/operatii-pe-biti&lt;br /&gt;
http://campion.edu.ro/arhiva/www/arhiva_2009/papers/paper21.pdf&lt;br /&gt;
&lt;br /&gt;
Tema 5&lt;br /&gt;
* [http://varena.ro/problema/laborator laborator]&lt;br /&gt;
* [http://varena.ro/problema/suc1 suc1] Propunere David&lt;br /&gt;
* [http://varena.ro/problema/colectie1 colectie1]&lt;br /&gt;
Infoarena&lt;br /&gt;
* [http://infoarena.ro/problema/clasic clasic] Propunere David&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=1065 xor1] Propunere David&lt;br /&gt;
* http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=404 sets&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
* [http://varena.ro/problema/2b1 2b1]  Olimpiada pe scoala 2015 clasa a 6-a [http://isa.algopedia.ro/wiki/index.php/2b1 Rez]&lt;br /&gt;
* [http://varena.ro/problema/suprapuneri suprapuneri] Cerc informatică Vianu [http://isa.algopedia.ro/wiki/index.php/suprapuneri Rez]&lt;br /&gt;
* [http://varena.ro/problema/monsters monsters] Cerc informatică Vianu [http://isa.algopedia.ro/wiki/index.php/monsterd Rez]&lt;br /&gt;
* [http://varena.ro/problema/ploaie1 ploaie1]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia26&amp;diff=18131</id>
		<title>10 2018 Lectia26</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia26&amp;diff=18131"/>
		<updated>2021-06-09T16:22:26Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Adaugare la sfarsitul listei ===&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1168 FAdaugareLaLista]====&lt;br /&gt;
Să se scrie o funcție C++ care adaugă o valoarea la finalul unei liste simplu înlănțuită.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// adaugă valoarea x la sfârșitul listei&lt;br /&gt;
void adaugare ( nod* &amp;amp;p, int x ){&lt;br /&gt;
  nod *q;&lt;br /&gt;
  q = new nod;      		// alocam o noua adresa&lt;br /&gt;
  q-&amp;gt;info = x;			// punem in campul info valoare de adaugat la lista&lt;br /&gt;
  q-&amp;gt;urm = NULL;    		// q va fi ultimul element al listei&lt;br /&gt;
  if ( p == NULL )  		// daca am lista vida&lt;br /&gt;
    p = q;			// q va fi primul nod al listei&lt;br /&gt;
  else {            		// daca avem noduri in lista&lt;br /&gt;
    nod *sf = p;	        // parcurgem lista pana la ultimul element al listei&lt;br /&gt;
    while ( sf-&amp;gt;urm != NULL )&lt;br /&gt;
      sf = sf-&amp;gt;urm;&lt;br /&gt;
    sf-&amp;gt;urm = q;		// leg ultimul nod al listei de noul nod alocat&lt;br /&gt;
  }	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Observatie: Pentru un acces rapid al ultimului element al listei, putem sa folosim un al doilea pointer care sa retina ultimul nod al listei, in acest fel accesul la ultimul nod al listei se va realiza in O(1) ci nu in O(n) ca in in exemplul de mai sus.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// adaugă valoarea x la sfârșitul listei&lt;br /&gt;
void adaugare ( nod* &amp;amp;p, nod* &amp;amp;u, int x ){&lt;br /&gt;
  nod *q;&lt;br /&gt;
  q = new nod;      		// alocam o noua adresa&lt;br /&gt;
  q-&amp;gt;info = x;			// punem in campul info valoare de adaugat la lista&lt;br /&gt;
  q-&amp;gt;urm = NULL;    		// q va fi ultimul element al listei&lt;br /&gt;
  if ( p == NULL )  		// daca am lista vida&lt;br /&gt;
    p = q, u = q;	        // q va fi si primul si ultimul nod al listei&lt;br /&gt;
  else {            		// daca avem noduri in lista&lt;br /&gt;
    u-&amp;gt;urm = q;		        // leg ultimul nod al listei de noul nod alocat&lt;br /&gt;
    u = q;                      // ultimul nod devine q&lt;br /&gt;
  }	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_14&amp;diff=18130</id>
		<title>Clasa a XI-a lecția 14</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_14&amp;diff=18130"/>
		<updated>2021-05-31T07:07:50Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Tema Optionala Pregatire Oli */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lectie =&lt;br /&gt;
== DFS ==&lt;br /&gt;
Parcurgerea în adâncime reprezintă explorarea “naturală” a unui graf neorientat. Este foarte asemănătoare cu modul în care un turist vizitează un oraș în care sunt obiective turistice (vârfurile grafului) și căi de acces între obiective (muchiile). Vizitarea orașului va avea loc din aproape în aproape: se pleacă de la un obiectiv de pornire, se continuă cu un obiectiv învecinat cu acesta, apoi unul învecinat cu al doilea, etc. &lt;br /&gt;
Parcurgerea în adâncime se face astfel:&lt;br /&gt;
* Se începe cu un vârf inițial x, care este în acest moment vârf curent.&lt;br /&gt;
* Vârful x se vizitează. Se determină primul său vecin nevizitat y al lui x, care devine vârf curent.&lt;br /&gt;
* Apoi se vizitează primul vecin nevizitat al lui y, şi aşa mai departe, mergând în adâncime, până când ajungem la un vârf care nu mai are vecini nevizitați. Când ajungem într-un astfel de vârf, ne întoarcem la “părintele” acestuia – vârful din care am ajuns în acesta.&lt;br /&gt;
* Dacă acest vârf mai are vecini nevizitați, alegem următorul vecin nevizitat al său și continuam parcurgerea în același mod.&lt;br /&gt;
* Dacă nici acest vârf nu mai are vecini nevizitați, revenim în vârful său părinte și continuăm în același mod, până când toate vârfurile accesibile din vârful de start sunt vizitate.&lt;br /&gt;
&#039;&#039;&#039;Observație&#039;&#039;&#039;&lt;br /&gt;
Dacă graful nu este conex, nu ser vor vizita toate vârfurile.&lt;br /&gt;
Exemplu&lt;br /&gt;
&lt;br /&gt;
[[Image:dfs.gif]]&lt;br /&gt;
&lt;br /&gt;
Parcurgerea din nodul 5: 5 2 1 4 6 3 7 8 9&lt;br /&gt;
&lt;br /&gt;
[[Image:graf-parcurgere-1.png]]&lt;br /&gt;
&lt;br /&gt;
Parcurgerea din nodul 1: 1 2 3 5 4 6 7 8 9&lt;br /&gt;
Parcurgerea din nodul 2: 2 1 4 5 7 8 9 6 3&lt;br /&gt;
Parcurgerea din nodul 9: 9 7 5 2 1 4 6 3 8&lt;br /&gt;
&lt;br /&gt;
Pentru implementarea algoritmului se foloseşte un vector caracteristic pentru memorarea faptului că un anume vârf a fost sau nu vizitat, la un anumit moment al parcurgerii:&lt;br /&gt;
v[i] = 0, vârful i nu a fost (încă) vizitat&lt;br /&gt;
v[i] = 1, vârful i a fost vizitat&lt;br /&gt;
Pentru a determina ordinea în care se parcurg nodurile care pot fi vizitate, se folosește o stivă: &lt;br /&gt;
se analizează mereu nodurile adiacent cu nodul din vârful stivei&lt;br /&gt;
dacă pentru nodul din vârful stivei găsim un vecin nevizitat, adăugăm nodul vecin pe stivă&lt;br /&gt;
dacă pentru nodul din vârful stivei nu mai găsim niciun vecin nevizitat, îl eliminăm de pe stivă&lt;br /&gt;
Pentru implementare se poate folosi ca stivă memoria STACK, prin intermediul recursivității.&lt;br /&gt;
&lt;br /&gt;
=== DFS Rerecursiv - reprezentare cu matrice de adiacenta ===&lt;br /&gt;
Functia DFS primeste ca parametru un nod de pornire si va parcurge graful in adancime. Tiparim nodurile parcurse in timp ce le vizitam.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#define dim 100                     // nr maxim de noduri&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream fin ( &amp;quot;dfs.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;dfs.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
bool viz[dim+1], a[dim+1][dim+1];&lt;br /&gt;
int n;&lt;br /&gt;
&lt;br /&gt;
void dfs( int nod ){&lt;br /&gt;
  fout &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;                       // afisam nodul curent&lt;br /&gt;
  viz[nod] = 1;                             // marcam nodul curent ca fiind vizitat&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ )            // parcurgem toti vecinii nodului curent&lt;br /&gt;
    if (a[nod][i] == 1 &amp;amp;&amp;amp; viz[i] == 0 )     // daca nodul nu este vizitat&lt;br /&gt;
      dfs( i );                             // parcurgem in adancime din nodul respectiv&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  int m, start, x, y;&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; start;          // citim nr de noduri, nr de muchii si nodul de start &lt;br /&gt;
  for (int i = 1; i &amp;lt;= m; i++) {&lt;br /&gt;
    fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;                 // citim o muchie&lt;br /&gt;
    a[x][y] = a[y][x] = 1;         // marcam muchia in matricea de adiacenta&lt;br /&gt;
  }&lt;br /&gt;
  dfs(start);                      // pornim parcurgerea in adancime&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DFS Recursiv - reprezentare cu liste de adiacenta, implementare cu vectori STL (optional) ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
#define nmax 150&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
vector &amp;lt;int&amp;gt; L[nmax];                       // Listele de adiacenta&lt;br /&gt;
char viz[nmax];&lt;br /&gt;
&lt;br /&gt;
void dfs( int nod ){&lt;br /&gt;
  printf( &amp;quot;%d &amp;quot;, nod );                     // afisam nodul curent&lt;br /&gt;
  viz[nod] = 1;                             // il marcam ca vizitat&lt;br /&gt;
  for( int i = 0; i &amp;lt; L[nod].size(); i++ )  // parcurgem lista vecinilo nodului curent&lt;br /&gt;
    if( viz[L[nod][i]] == 0 )               // daca vecinul i nu L fost vizitat&lt;br /&gt;
      dfs(L[nod][i]);                       // parcurgem in adancime din nodul i&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  freopen( &amp;quot;dfs.in&amp;quot;, &amp;quot;r&amp;quot;, stdin );&lt;br /&gt;
  freopen( &amp;quot;dfs.out&amp;quot;, &amp;quot;w&amp;quot;, stdout );&lt;br /&gt;
  int n, m, start, x, y;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%d%d%d&amp;quot;, &amp;amp;n, &amp;amp;m, &amp;amp;start);  // nr de noduri, nr de muchii, punctul de start&lt;br /&gt;
  for(int i = 1; i &amp;lt;= m; i++ ){    &lt;br /&gt;
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;x, &amp;amp;y );&lt;br /&gt;
    L[x].push_back(y);              // in lista vecinilor lui x, L[x], punem nodul y &lt;br /&gt;
    L[y].push_back(x);              // in lista vecinilor lui y, L[y], punem nodul x &lt;br /&gt;
  }&lt;br /&gt;
  /* Daca dorim sa parcurgem vecinii in ordine, va trebui sa sortam listele cu vecini &lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    sort( L[i].begin(), L[i].end());    // sortam fiecare lista de vecini, pentru L parcurge vecinii in ordine&lt;br /&gt;
  */&lt;br /&gt;
  dfs(s);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DFS recursiv - reprezentare cu liste de adiacenta, implementare liste alocate dinamic ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
#define nmax 150&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
char viz[nmax];&lt;br /&gt;
struct nd{&lt;br /&gt;
  int x;&lt;br /&gt;
  nd *adr;&lt;br /&gt;
};&lt;br /&gt;
nd* L[nmax];         // listele de adiacenta&lt;br /&gt;
&lt;br /&gt;
// adaugarea unui nod la o lista L; Noturile nu vor fi in ordine creascatoare in liste&lt;br /&gt;
&lt;br /&gt;
void add( nd* &amp;amp;L, int nod ){&lt;br /&gt;
  nd* p = new nd;    // alocam un nou nod&lt;br /&gt;
  p -&amp;gt; x = nod;      // punem in nodul creat valoarea val&lt;br /&gt;
  p -&amp;gt; adr = L;      // legam nodul la lista L( adaugam nodul la inceputul listei )&lt;br /&gt;
  L = p;             // primul nod al listei devine p&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void dfs( int nod ){&lt;br /&gt;
  nd* p;&lt;br /&gt;
  viz[nod] = 1;&lt;br /&gt;
  printf( &amp;quot;%d &amp;quot;, nod );&lt;br /&gt;
  // parcurgem lista de vecini ai nodului v&lt;br /&gt;
  p = L[nod];                // L[nod] e adresa primului nod din lista vecinilor nodului nod&lt;br /&gt;
  while ( p != NULL ){       // cata vreme nu am ajuns la sfarsitul listei ( lista se termina cu o adresa NULL )&lt;br /&gt;
    if ( !viz[p -&amp;gt; x] )      // daca vecinul e nevizitat ( p-&amp;gt;x e vecinul lui nod )&lt;br /&gt;
      dfs( p -&amp;gt; x );         // parcurgem in adancime mai departe din nodul p-&amp;gt;x )&lt;br /&gt;
    p = p -&amp;gt; adr;            // trecem la urmatorul vecin&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  freopen( &amp;quot;dfs.in&amp;quot;, &amp;quot;r&amp;quot;, stdin );&lt;br /&gt;
  freopen( &amp;quot;dfs.out&amp;quot;, &amp;quot;w&amp;quot;, stdout );&lt;br /&gt;
  int n, m, start, x, y, i;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%d%d%d&amp;quot;, &amp;amp;n, &amp;amp;m, &amp;amp;start);     // nr de noduri, nr de muchii, punctul de start&lt;br /&gt;
  for( i = 1; i &amp;lt;= m; i++ ){&lt;br /&gt;
    scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;x, &amp;amp;y );           // citim o muchie [x, y]&lt;br /&gt;
      add( L[x], y );                  // in lista vecinilor lui x, L[x], punem nodul y&lt;br /&gt;
      add( L[y], x );                  // in lista vecinilor lui y, L[y], punem nodul x&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  dfs(start);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lant, Ciclu, Conexitate - Componente conexe, componente biconexe ==&lt;br /&gt;
=== Lanț ===&lt;br /&gt;
&#039;&#039;&#039;Definiție&#039;&#039;&#039;: Se numește &#039;&#039;&#039;lanț&#039;&#039;&#039; o succesiune de vârfuri &#039;&#039;&#039;L = [x1,x2,⋯xk]&#039;&#039;&#039; cu proprietatea că oricare două vârfuri consecutive sunt adiacente ( adica exista muchie intre ele ).&lt;br /&gt;
&lt;br /&gt;
* Vârfurile &#039;&#039;&#039;x&amp;lt;sub&amp;gt;1&#039;&#039;&#039; şi &#039;&#039;&#039;x&amp;lt;sub&amp;gt;k&#039;&#039;&#039; se numesc extremitățile lanțului. &lt;br /&gt;
* Numărul &#039;&#039;&#039;k-1&#039;&#039;&#039; se numește lungimea lanțului și este numărul de muchii din care este format.&lt;br /&gt;
* Lanțul care conține numai vârfuri distincte, două câte două, este &#039;&#039;&#039;lanț elementar&#039;&#039;&#039;.&lt;br /&gt;
* Lanțul care conține numai muchii distincte este &#039;&#039;&#039;lanț simplu&#039;&#039;&#039;. &lt;br /&gt;
* Dacă muchiile unui lanț nu sunt distincte se numește &#039;&#039;&#039;lanț compus&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Exemplu [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=475 Lant] - generarea tuturor lanturilor intre 2 noduri date ====	&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu n vârfuri și două vârfuri p q. Să se determine toate lanțurile elementare cu extremitățile p și q.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream in(&amp;quot;lant.in&amp;quot;);&lt;br /&gt;
ofstream out(&amp;quot;lant.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
int n,m, p, q, r;&lt;br /&gt;
int a[21][21], lant[21];&lt;br /&gt;
bool viz[21];&lt;br /&gt;
&lt;br /&gt;
void afish( int k ){&lt;br /&gt;
  for (int i = 1; i &amp;lt;= k; i++ )&lt;br /&gt;
     out &amp;lt;&amp;lt; lant[i] &amp;lt;&amp;lt;&#039; &#039;;&lt;br /&gt;
  out &amp;lt;&amp;lt; endl;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void backtr( int k, int nod ){&lt;br /&gt;
  lant[k] = nod;		  // notez nodul curent in lant&lt;br /&gt;
  viz[nod] = 1;          	  // marcam ca am vizitat nodul &amp;quot;nod&amp;quot;&lt;br /&gt;
  if ( nod == q )           	  // daca am ajuns la nodul q am terminat de construit lantul&lt;br /&gt;
    afish( k );                   // afisez sol daca nu a fost vizitat si nodul k&lt;br /&gt;
  else&lt;br /&gt;
    for (int i = 1; i &amp;lt;= n; i++ ) // adaugam in lant toate nodurile care nevizitate&lt;br /&gt;
      if ( a[nod][i] == 1 &amp;amp;&amp;amp; viz[i] == 0 )       &lt;br /&gt;
        backtr( k + 1, i );&lt;br /&gt;
      &lt;br /&gt;
  viz[nod] = 0;                   // demarcam ca vizitat nodul, pentru a putea gasi alt lant care il contine&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  in &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;&lt;br /&gt;
  int x, y;&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= m; i++ ){&lt;br /&gt;
    in &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;&lt;br /&gt;
    a[x][y] = a[y][x] = 1;&lt;br /&gt;
  }&lt;br /&gt;
  in &amp;gt;&amp;gt; p &amp;gt;&amp;gt; q;         // dorim toate lanturile care incep din p si se termina in q &lt;br /&gt;
  &lt;br /&gt;
  backtr( 1, p );       // pornim construirea lantului de la nodul p, vectorul solutie construindu-se de la pozitia 1&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Probleme similare- Generarea tuturor lanturilor intr-un graf&#039;&#039;&#039; &lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=475 Lant] -  TEORIE - generarea tuturor lanturilor intre 2 noduri date&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=476 Lanturi] - TEORIE - toate lanturile intre p si q care trec prin r&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=477 Lanturi1] - LABORATOR - toate lanturile intre p si q care NU trec prin r&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=479 LantMaxim]  - LABORATOR - din toatel lanturile generate, il salvez pe cel mai lung&lt;br /&gt;
&lt;br /&gt;
=== Ciclu ===&lt;br /&gt;
&#039;&#039;&#039;Definiție&#039;&#039;&#039;: Se numește &#039;&#039;&#039;ciclu&#039;&#039;&#039; un lanț simplu ( adica graful are numai muchii distincte ) în care primul vârf este identic cu ultimul. &lt;br /&gt;
&lt;br /&gt;
* Dacă toate vârfurile sunt distincte, mai puțin primul și ultimul, se numește &#039;&#039;&#039;ciclu elementar&#039;&#039;&#039;.&lt;br /&gt;
* Lungimea unui ciclu este egală cu numărul de muchii din ciclu. Lungimea minimă a unui ciclu este 3.&lt;br /&gt;
* Un ciclu se numește par dacă lungimea sa este pară, respectiv impar în caz contrar.&lt;br /&gt;
* Un graf neorientat care nu conține nici un ciclu se numește &#039;&#039;aciclic&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Exemple: În graful de mai jos:&lt;br /&gt;
&lt;br /&gt;
[[image:graf-neorientat-3.png]]&lt;br /&gt;
&lt;br /&gt;
*[2,4,1,3,5,7]  este un lanț elementar&lt;br /&gt;
*[3,5,7,6,5,1] este un lanț neelementar, dar simplu&lt;br /&gt;
*[2,3,5,7,6,5,3,1] este un lanț compus&lt;br /&gt;
*[1,5,3,2,4,1] este un ciclu elementar&lt;br /&gt;
*[1,3,5,7,6,5,1] este un ciclu neelementar&lt;br /&gt;
&lt;br /&gt;
=== Graf conex. Componente conexe===&lt;br /&gt;
Definiție: Un graf neorientat se numește graf conex dacă pentru oricare două vârfuri x și y diferite ale sale, există cel puțin un lanț care le leagă, adică x este extremitatea inițială și y este extremitatea finală.&lt;br /&gt;
&lt;br /&gt;
Un graf cu un singur nod este, prin definiție, conex.&lt;br /&gt;
&lt;br /&gt;
Definiție: Se numește componentă conexă a unui graf G=(X,U) un subgraf H=(Y, V), conex, al lui G&lt;br /&gt;
care are proprietatea că nu există nici un lanț în G care să lege un vârf din Y cu un vârf din X – Y.&lt;br /&gt;
&lt;br /&gt;
Subgraful H este conex și maximal cu această proprietate (dacă s-ar mai adăuga un vârf nu ar mai fi conex.)&lt;br /&gt;
&lt;br /&gt;
Un graf este conex dacă admite o singură componentă conexă.&lt;br /&gt;
&lt;br /&gt;
Exemple: graful din imaginea de mai sus este conex, graful din imaginea urmatoare nu este conex :&lt;br /&gt;
&lt;br /&gt;
[[image:graf-neorientat-0.png]]&lt;br /&gt;
&lt;br /&gt;
Definiție: Un graf este &#039;&#039;&#039;biconex&#039;&#039;&#039; dacă este conex şi pentru orice vârf eliminat subgraful generat îşi păstrează proprietatea de conexitate.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Rezolvarea problelor de conexitate:&#039;&#039;&#039;&lt;br /&gt;
Urmatoarele probleme sunt legate de verificarea conexitatii grafurilor. &lt;br /&gt;
* Verificam daca un graf este conex parcurgand graful dintr-un nod oarecare (cu DFS sau BFS ). Daca am ajuns in toate nodurile grafului atunci graful este conex.&lt;br /&gt;
* Numaram componentele conexe ale unui graf parcurgand graful (cu DFS sau BFS )&lt;br /&gt;
&lt;br /&gt;
==== Exemplu [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=438 ComponenteConexe]  ==== &lt;br /&gt;
&#039;&#039;&#039;Afisarea componentelor conexe&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat. Să se afișeze componentele conexe ale acestui graf.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#define dim 100                     // nr maxim de noduri&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
ifstream in (&amp;quot;componenteconexe.in&amp;quot;);&lt;br /&gt;
ofstream out (&amp;quot;componenteconexe.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
char viz[dim+1];&lt;br /&gt;
char a[dim+1][dim+1];&lt;br /&gt;
int n, cnt;&lt;br /&gt;
&lt;br /&gt;
void dfs( int nod ){&lt;br /&gt;
  //out &amp;lt;&amp;lt; nod &amp;lt;&amp;lt; &amp;quot; &amp;quot;;                           // afisam nodul curent&lt;br /&gt;
  viz[nod] = cnt;                                // marcam nodul curent cu nr componentei conexe&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ )                 // parcurgem toti vecinii nodului curent&lt;br /&gt;
      if (a[nod][i] == 1 &amp;amp;&amp;amp; viz[i] == 0 )        // daca nodul nu este vizitat&lt;br /&gt;
          dfs(i);                                // parcurgem in adancime din nodul respectiv&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  int m, x, y, i;&lt;br /&gt;
  in &amp;gt;&amp;gt; n ;                      // citim nr de noduri&lt;br /&gt;
  while ( in &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y ) {       // citim o muchie&lt;br /&gt;
    a[x][y] = a[y][x] = 1;       // marcam muchia in matricea de adiacenta&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  cnt = 0;&lt;br /&gt;
  for (i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    if( !viz[i] ){&lt;br /&gt;
      cnt ++;&lt;br /&gt;
      dfs(i);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  out &amp;lt;&amp;lt; cnt &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
  for ( int c = 1; c &amp;lt;= cnt; c++ ) {&lt;br /&gt;
    for (int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
      if ( viz[i] == c )&lt;br /&gt;
        out &amp;lt;&amp;lt; i  &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    out &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Componente biconexe (optional) ===&lt;br /&gt;
Se dă un graf neorientat G = (V, E). Un graf se numeşte graf biconex dacă nu are puncte de articulaţie. Un nod se numeşte punct de articulaţie dacă subgraful obţinut prin eliminarea nodului şi a muchiilor incidente cu acesta nu mai este conex. O componentă biconexă a unui graf este un subgraf biconex maximal cu această proprietate.&lt;br /&gt;
&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/1572/componentebiconexe componentebiconexe]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Articol si probleme:&#039;&#039;&#039; &lt;br /&gt;
https://www.infoarena.ro/problema/biconex&lt;br /&gt;
&lt;br /&gt;
= TEMA  = &lt;br /&gt;
&lt;br /&gt;
== Probelme rezolvate in curs ==&lt;br /&gt;
Implementati problemele rezolvate in curs&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=539 DFS]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=475 Lant] &lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=438 ComponenteConexe]&lt;br /&gt;
* [https://www.infoarena.ro/problema/dfs dfs infoarena] - nr de componente conexe&lt;br /&gt;
&lt;br /&gt;
== Tema Teorie ==&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/probleme/474/veriflant VerifLant] ====&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu n vârfuri și o succesiune de k vârfuri. Să se verifice dacă vârfurile din succesiune formează un lanț.&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=476 Lanturi] - toate lanturile intre p si q care trec prin r====&lt;br /&gt;
(vezi problema lant din curs )&lt;br /&gt;
&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu n vârfuri și trei vârfuri p q r. Să se determine toate lanțurile elementare cu extremitățile în p și q care conțin vârful r.&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/probleme/478/ciclu ciclu] ====&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu n vârfuri și un vârf p. Să se determine un ciclu elementar care conține vârful p.&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/probleme/437/conex Conex] ====&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat. Să se verifice dacă graful este sau nu conex.&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=441 ComponenteConexe1] ====&lt;br /&gt;
&#039;&#039;&#039;Nr minim de muchii de adaugat pentru ca graful sa devina conex&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat. Să se determine numărul minim de muchii care trebuie adăugate pentru ca graful să devină conex, precum și un set de asemenea muchii.&lt;br /&gt;
&lt;br /&gt;
== Tema Laborator ==&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=479 LantMaxim] ====&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu n vârfuri și două vârfuri p q. Să se determine cel mai lung lanț elementar cu extremitățile p și q.&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=477 Lanturi1] ====&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat cu n vârfuri și trei vârfuri p q r. Să se determine toate lanțurile elementare cu extremitățile în p și q care nu conțin vârful r.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=537 ComponenteConexe2] === &lt;br /&gt;
&#039;&#039;&#039;Nr maxim de muchii ce pot fi eliminate astfel incat graful sa ramana conex&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat. Să se determine numărul de muchii care pot fi eliminate din graf astfel încât numărul de componente conexe ale grafului să nu se modifice.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1603 ComponenteConexe3] === &lt;br /&gt;
&#039;&#039;&#039;Componenta conexa cu nr maxim de noduri, reprezentantul componentei conexe = nodul cu nr cel mai mic &#039;&#039;&#039;&lt;br /&gt;
Se dă lista muchiilor unui graf neorientat. Pentru fiecare componentă conexă numim cel mai mic vârf de ea reprezentant al componentei conexe. &lt;br /&gt;
Determinați reprezentantul componentei conexe cu cele mai multe vârfuri și câte noduri conține aceasta.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2282 ComponenteConexe4] - UNION FIND ===&lt;br /&gt;
Se consideră un graf neorientat cu n vârfuri și m muchii. Cele m muchii se elimină pe rând din graf. Pentru fiecare muchie eliminată trebuie să spuneți câte componente conexe are graful.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
const int MAXN = 1e5;&lt;br /&gt;
const int MAXM = 5e5;&lt;br /&gt;
&lt;br /&gt;
int node1[MAXM], node2[MAXM];&lt;br /&gt;
int component[MAXN + 1], ans[MAXM];&lt;br /&gt;
&lt;br /&gt;
int find_component(int node) {&lt;br /&gt;
  if (component[node] != node)&lt;br /&gt;
    component[node] = find_component(component[node]);&lt;br /&gt;
  return component[node];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, m;&lt;br /&gt;
    //ifstream cin(&amp;quot;componenteconexe4.in&amp;quot;);&lt;br /&gt;
    //ofstream cout(&amp;quot;componenteconexe4.out&amp;quot;);&lt;br /&gt;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;&lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i)&lt;br /&gt;
      cin &amp;gt;&amp;gt; node1[i] &amp;gt;&amp;gt; node2[i];&lt;br /&gt;
    &lt;br /&gt;
    // initial fiecare nod i face parte din componenta conexa cu nr  i (toate nodurile sunt izolate si au ca reprezentant pe ele insele)&lt;br /&gt;
    for ( int i = 1; i &amp;lt;= n; ++i )&lt;br /&gt;
      component[i] = i;&lt;br /&gt;
    &lt;br /&gt;
    // avem de eliminat m muchii, dupa ultima eliminare voi avea n componente conexe&lt;br /&gt;
    ans[m - 1] = n;&lt;br /&gt;
    // vom adauga pe rand cate o muchie in graf, in ordinea inversa eliminarii &lt;br /&gt;
    // si vom determina nr de comp conexe  rzultate( vom verifica daca am unit cu o muchie 2 comp conexe                                        &lt;br /&gt;
    for (int i = m - 2; i &amp;gt;= 0;  --i ) {&lt;br /&gt;
      int x = find_component(node1[i + 1]);     // determinam reprezentantul comp conexe din care face parte x&lt;br /&gt;
      int y = find_component(node2[i + 1]);     // determinam reprezentantul comp conexe din care face parte y&lt;br /&gt;
      ans[i] = ans[i + 1];                      // nr componente conexe e cel anterior&lt;br /&gt;
      if ( x != y ) {                           // daca x si y nu fac parte din aceeasi comp conexa, &lt;br /&gt;
        --ans[i];                               // atunci inseamna ca prin muchia x,y unim 2 comp conexe deci scade nr de comp cu 1&lt;br /&gt;
        component[x] = y;                       // reprezentantul componentei conexe x devine nodul y;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // afisam raspunsurile &lt;br /&gt;
    for (int i = 0; i &amp;lt; m; ++i)&lt;br /&gt;
      cout &amp;lt;&amp;lt; ans[i] &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=963 Bazine] ==== &lt;br /&gt;
&#039;&#039;&#039;Nr componentelor conexe&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La ştrandul Junior din oraşul nostru s-au construit n bazine pentru înot. Fiecare bazin a fost dotat cu câte un robinet pentru umplerea acestuia cu apă. Între m perechi distincte de bazine, a fost instalată câte o ţeavă prin care apa din cele două bazine din fiecare pereche să poată circula. Astfel, cele două bazine din pereche pot fi umplute prin deschiderea unui singur robinet.&lt;br /&gt;
Administratorul bazei a numerotat bazinele cu numerele distincte de la 1 la n şi a notat în registrul lui cele m perechi de numere (x1,y1), (x2,y2),…., (xm,ym) corespunzând perechilor de bazine între care a fost instalată câte o ţeavă. Pentru a umple toate bazinele cu apă, administratorul doreşte să deschidă un număr minim de robinete.&lt;br /&gt;
Scrieţi un program care să citească numerele naturale n şi m, şi cele 2*m numere naturale x1, y1, x2, y2,…., xm, ym, cu semnificația din enunț, şi care să afişeze cel mai mic număr k de robinete pe care trebuie să le deschidă administratorul astfel încât să fie umplute cu apă toate bazinele.&lt;br /&gt;
&lt;br /&gt;
====#1707 Retea====&lt;br /&gt;
Se consideră o rețea formată din n servere, numerotate de la 1 la n. În rețea există m perechi de servere x y cunoscute între care există legături de comunicație directe. Între oricare două servere din rețea există legături, fie directe, fie prin intermediul altor servere.&lt;br /&gt;
&lt;br /&gt;
Stabiliți pentru fiecare dintre cele n servere dacă eliminarea sa din rețea conduce la pierderea legăturii dintre cel puțin două servere rămase.&lt;br /&gt;
&lt;br /&gt;
====#1462 Gasti====&lt;br /&gt;
Să se determine câte găști există în orașul Nicăieri și în câte moduri se poate forma o nouă relație de prietenie, astfel încât, să se obțină o nouă gașcă, cu număr maxim de membri.&lt;br /&gt;
&lt;br /&gt;
== Tema Optionala Pregatire Oli ==&lt;br /&gt;
recapitulare DFS pe matrice (FILL)(ambele probleme admit sol si cu BFS )&lt;br /&gt;
* https://www.infoarena.ro/problema/dreptunghiuri2 - ONI 2010, clasa a 10-a  ??&lt;br /&gt;
* https://www.infoarena.ro/problema/padure Stelele Informaticii 2006, clasele 9-10&lt;br /&gt;
mediu&lt;br /&gt;
* https://www.infoarena.ro/problema/autobuze3 - Concursul National de Informatica &amp;quot;Adolescent Grigore Moisil&amp;quot;&lt;br /&gt;
* https://www.infoarena.ro/problema/berarii2 - FMI No Stress 2012&lt;br /&gt;
* https://www.infoarena.ro/problema/banana - ONI 2002 ( ati avut-o si la BFS )&lt;br /&gt;
greu&lt;br /&gt;
* https://www.infoarena.ro/problema/arbore -preONI 2006 Runda Finala&lt;br /&gt;
* https://www.infoarena.ro/problema/bcolor&lt;br /&gt;
&lt;br /&gt;
mai multe probleme aici:&lt;br /&gt;
* https://www.infoarena.ro/cauta-probleme?tag_id[]=69&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*  [https://www.pbinfo.ro/probleme/3235/entries Entries] ONI 2001, clasele XI-XII - UNION FIND&lt;br /&gt;
Se consideră un graf care inițial este format din P noduri izolate, etichetate de la 1 la P. Se mai consideră N intrări, unde intrare poate însemna:&lt;br /&gt;
&lt;br /&gt;
comandă – o comandă are forma I + J, cu semnificația că în graf se adaugă muchia care unește nodurile I și J (dacă I și J erau deja unite în acel moment, nu se întreprinde nici o acțiune);&lt;br /&gt;
întrebare – o întrebare este de forma I ? J, adică se întreabă dacă în acel moment I și J sunt în aceeași componentă conexă.&lt;br /&gt;
Se pleacă deci de la un graf inițial format din noduri izolate, care pe parcurs se “unifică”. Tot pe parcurs sunteți întrebat dacă anumite perechi de noduri sunt sau nu în aceeași componentă conexă. Scrieți un program care să răspundă la întrebările din fișierul de intrare.&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Rucsac&amp;diff=18125</id>
		<title>Rucsac</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Rucsac&amp;diff=18125"/>
		<updated>2021-03-28T21:00:26Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Note de curs Clasa a 11-a , Dinamica, Isabela Coman&lt;br /&gt;
= Problema Rucsacului =&lt;br /&gt;
Considerăm un set de &#039;&#039;&#039;n&#039;&#039;&#039; obiecte, fiecare fiind caracterizat de un volum ( dimensiune ) &#039;&#039;&#039;vol&#039;&#039;&#039; și de o valoare &#039;&#039;&#039;val&#039;&#039;&#039;, și un rucsac cu un volum &#039;&#039;&#039;G&#039;&#039;&#039;. Să se selecteze un subset de obiecte astfel încât volumul total al obiectelor selectate să fie &amp;lt;= &#039;&#039;&#039;G&#039;&#039;&#039; iar valoarea totală a obiectelor selectate să fie maximă.&lt;br /&gt;
Variante:&lt;br /&gt;
* Varianta continuă (fracționară): pot fi selectate obiecte in întregime &#039;&#039;&#039;sau fracțiuni&#039;&#039;&#039; ale obiectelor.&lt;br /&gt;
* Varianta discretă(0-1): obiectele pot fi selectate doar în întregime&lt;br /&gt;
&lt;br /&gt;
 Exemplu: n = 3, G = 5,&lt;br /&gt;
 vol   1   2   3&lt;br /&gt;
 val   6  10  12&lt;br /&gt;
 unit  6   5   4 &lt;br /&gt;
 &lt;br /&gt;
Pentru Varianta Fractionara &#039;&#039;&#039;Tehnica Greedy&#039;&#039;&#039; ne poate da solutia problemei:&lt;br /&gt;
* Se sortează lista de obiecte descrescător după valoarea pe unitatea de volum unit = val / dim&lt;br /&gt;
* Se selectează obiectele în această ordine până când nu mai încap elemente in rucsac. Daca am obtinut un volum egal cu volumul Ruxacului, atunci am obtinut solutia finala. Altfel, vom lua din urmatorul obiect o fractiune, pentru a completa volumul Ruxacului.&lt;br /&gt;
&lt;br /&gt;
Astfel, pentru exemplul de mai sus, pentru a umple ruscacul de dimensiune 5, vom selecta primele 2 obiecte si 2 unitati din obiectul al treilea, de volum 3.&lt;br /&gt;
solutia va fi: ( 1, 1, 2/3 ) - obtinem valoarea: 6 + 10 + 8 = 24&lt;br /&gt;
&lt;br /&gt;
Pentru Varianta discreta Tehnica Greedy nu ne va da solutia optima. Conform acestei tehnici, vom pune in rucsac primele 2 obiecte, obtinand solutia: &lt;br /&gt;
* solutia ( 1, 1, 0 )  Alegem primele 2 obiecte care ocupa un volum = 3 si obtinem o valoare de: 6 + 10 = 16&lt;br /&gt;
O solutie mai buna ar fi:&lt;br /&gt;
* solutia (0, 1, 1 ) - Alegem ultimele 2 obiecte care ocupa un volum = 5 si obtinem o valoare de: 10 + 12 = 22&lt;br /&gt;
&lt;br /&gt;
===Problema Rucsacului - Varianta discretă(0-1) ===&lt;br /&gt;
Problema rucsacului poate fi reformulată astfel: se caută (s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;,s&amp;lt;sub&amp;gt;2&amp;lt;/sub&amp;gt;,…,s&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;) cu s&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; in {0,1} astfel încât:&lt;br /&gt;
 * s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;*d&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; +…+ s&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;*d&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt; &amp;lt;= C (restricție)&lt;br /&gt;
 * s&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;*v&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt; +…+ s&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;*v&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;  este maximă (criteriu de optim)&lt;br /&gt;
Vectorul &#039;&#039;&#039;s&#039;&#039;&#039; descrie ce elemente sunt selectate, astfel incat valoarea lor sa fie maxima, &amp;lt;= C&lt;br /&gt;
&lt;br /&gt;
[[file:Rucsac0_1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
====Varianta iterativa - bottom up ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
const int NMAX = 1000;             // nr maxim de obiecte&lt;br /&gt;
const int GMAX = 10000;&lt;br /&gt;
&lt;br /&gt;
int a[NMAX+1][GMAX+1];&lt;br /&gt;
int n, G, g;                       // nr obiectelor, capacitatea rucsacului&lt;br /&gt;
int vol[NMAX+1], val[NMAX+1];&lt;br /&gt;
int main() {&lt;br /&gt;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; G;&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    cin &amp;gt;&amp;gt; vol[i] &amp;gt;&amp;gt; val[i];&lt;br /&gt;
&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    for( int j = 1; j &amp;lt;= G; j++ ) {&lt;br /&gt;
      if ( j &amp;lt; vol[i] )&lt;br /&gt;
        a[i][j] = a[i-1][j];&lt;br /&gt;
      else&lt;br /&gt;
        a[i][j] = max ( a[i-1][j], a[i-1][j-vol[i]] + val[i] );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  for( int i = 0; i &amp;lt;= n; i++ ){&lt;br /&gt;
    for( int j = 0; j &amp;lt;= G; j++ )&lt;br /&gt;
      cout &amp;lt;&amp;lt; a[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    cout &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; a[n][G] &amp;lt;&amp;lt; &#039;\n&#039;;           //   val maxima obtinua&lt;br /&gt;
&lt;br /&gt;
  //ce obiecte am selectat?&lt;br /&gt;
  int sol[NMAX+1] = {0};&lt;br /&gt;
  int i = n;&lt;br /&gt;
  int j = G;&lt;br /&gt;
  while ( j ){&lt;br /&gt;
    if ( a[i][j] != a[i-1][j] ) {&lt;br /&gt;
      sol[i] = 1;              // elem i e selectat&lt;br /&gt;
      j = j - vol[i];          // ne ducem pe col volumului ramas&lt;br /&gt;
    }&lt;br /&gt;
    i --;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    if (sol[i])&lt;br /&gt;
      cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
3 5&lt;br /&gt;
1 6&lt;br /&gt;
2 10&lt;br /&gt;
3 12&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Varianta recursiva top-down + Memoizare ====&lt;br /&gt;
Pt a construi soluția sunt suficiente doar valorile marcate. Numărul calculelor poate fi redus dacă&lt;br /&gt;
se calculează doar valorile necesare construcției solutiei. Acest lucru se poate realiza prin&lt;br /&gt;
îmbinarea abordării descendente cu cea ascendentă (cu reținerea valorilor calculate). Aceasta este denumita tehnica memoizării.&lt;br /&gt;
* Abordarea ascendentă clasică (prezentata anterior )rezolvă toate subproblemele (chiar și cele care nu contribuie la soluția optimă) însă fiecare problemă este rezolvată o singură dată.&lt;br /&gt;
* Abordarea descendentă ( recursiva ) clasică rezolvă doar subproblemele ce contribuie la soluția problemei însă o subproblemă este rezolvată de câte ori apare (din acest motiv implementarea recursivă este în general ineficientă)&lt;br /&gt;
&lt;br /&gt;
Tehnica memoizării rezolvă o singură dată doar subproblemele ce contribuie la soluția problemei&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Etape:&#039;&#039;&#039;&lt;br /&gt;
* Se inițializează matrice cu o valoare diferita de orice valoare s-ar obține prin dezvoltarea relației de recurență, pentru a marca faptul ca o valorile nu sunt inca calculate.&lt;br /&gt;
* Se calculează valoarea țintă a[n,G] în manieră recursivă însă toate valorile intermediare se stochează și se utilizează atunci când e necesar. &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#define D 0&lt;br /&gt;
using namespace std;&lt;br /&gt;
const int NMAX = 1000;             // nr maxim de obiecte&lt;br /&gt;
const int GMAX = 10000;&lt;br /&gt;
&lt;br /&gt;
int a[NMAX+1][GMAX+1];&lt;br /&gt;
int n, G, g;                       // nr obiectelor, capacitatea rucsacului&lt;br /&gt;
int vol[NMAX+1], val[NMAX+1];&lt;br /&gt;
&lt;br /&gt;
int comp ( int i, int j ){&lt;br /&gt;
  if ( i == 0 || j == 0 ) {&lt;br /&gt;
    return 0;&lt;br /&gt;
  }&lt;br /&gt;
  if ( a[i][j] != -1 )     // daca val e deja calculata, o returnam&lt;br /&gt;
    return a[i][j];&lt;br /&gt;
  int x = comp( i-1, j );    // daca nu as avea comp i-1 in sol&lt;br /&gt;
  if ( j &amp;lt; vol[i] )&lt;br /&gt;
    a[i][j] = x;&lt;br /&gt;
  else&lt;br /&gt;
    a[i][j] = max ( x, comp( i-1, j-vol[i]) + val[i] );&lt;br /&gt;
  return a[i][j];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; G;&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    cin &amp;gt;&amp;gt; vol[i] &amp;gt;&amp;gt; val[i];&lt;br /&gt;
&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    for( int j = 1; j &amp;lt;= G; j++ ) {&lt;br /&gt;
      a[i][j] = -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  cout &amp;lt;&amp;lt; comp(n,G) &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
&lt;br /&gt;
  if ( D ){&lt;br /&gt;
    for( int i = 0; i &amp;lt;= n; i++ ){&lt;br /&gt;
      for( int j = 0; j &amp;lt;= G; j++ )&lt;br /&gt;
        cout &amp;lt;&amp;lt; a[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
      cout &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  //ce obiecte am selectat?&lt;br /&gt;
  int sol[NMAX+1] = {0};&lt;br /&gt;
  int i = n;&lt;br /&gt;
  int j = G;&lt;br /&gt;
  while ( j ){&lt;br /&gt;
    if ( a[i][j] != a[i-1][j] ) {&lt;br /&gt;
      sol[i] = 1;              // elem i e selectat&lt;br /&gt;
      j = j - vol[i];          // ne ducem pe col volumului ramas&lt;br /&gt;
    }&lt;br /&gt;
    i --;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for( int i = 0; i &amp;lt;= n; i++ )&lt;br /&gt;
    if (sol[i])&lt;br /&gt;
      cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
3 5&lt;br /&gt;
1 6&lt;br /&gt;
2 10&lt;br /&gt;
3 12&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Optimizarea memoriei utilizate in varianta iterativa Bottom-up ====&lt;br /&gt;
In solutia iterativa, putem observa ca pentru o anumita linie din dinamica, recurenta nu se foloseste decat de linia precedenta, deci retinerea intregului tablou este inutila, in cazul in care trebuie sa calculam doar valoarea maxima a rucsacului. Putem sa reţinem doar o singura linie, dacă parcurgem linia în sensul invers al greutăţilor. &lt;br /&gt;
[https://www.infoarena.ro/problema/rucsac rucsac varena]&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#define D 0&lt;br /&gt;
using namespace std;&lt;br /&gt;
const int NMAX = 5000;             // nr maxim de obiecte&lt;br /&gt;
const int GMAX = 10000;&lt;br /&gt;
ifstream fin(&amp;quot;rucsac.in&amp;quot;);&lt;br /&gt;
ofstream fout(&amp;quot;rucsac.out&amp;quot;);&lt;br /&gt;
int a[GMAX+1];&lt;br /&gt;
int n, G, g;                       // nr obiectelor, capacitatea rucsacului&lt;br /&gt;
int vol[NMAX+1], val[NMAX+1];&lt;br /&gt;
int main() {&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; G;&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    fin &amp;gt;&amp;gt; vol[i] &amp;gt;&amp;gt; val[i];&lt;br /&gt;
&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    for( int j = G; j &amp;gt;= vol[i]; j-- ) {&lt;br /&gt;
      a[j] = max ( a[j], a[j-vol[i]] + val[i] );&lt;br /&gt;
    }&lt;br /&gt;
   if ( D ) {&lt;br /&gt;
     for( int j = 1; j &amp;lt;= G; j++ )&lt;br /&gt;
        cout &amp;lt;&amp;lt; a[j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
     cout &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
  fout &amp;lt;&amp;lt; a[G] &amp;lt;&amp;lt; &#039;\n&#039;;           //   val maxima obtinua&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aplicatii =&lt;br /&gt;
&lt;br /&gt;
===[https://www.varena.ro/problema/rucsac rucsac varena]===&lt;br /&gt;
Se citesc doua numere naturale N si K si un sir v de N numere naturale. Sa se raspunda la urmatoarea intrebare:&lt;br /&gt;
Cate subsiruri ale sirului initial au suma elementelor egala cu K?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
#define MOD 999979&lt;br /&gt;
using namespace std;&lt;br /&gt;
const int NMAX = 500;             // nr maxim de obiecte&lt;br /&gt;
const int GMAX = 250000;&lt;br /&gt;
ifstream fin(&amp;quot;rucsac.in&amp;quot;);&lt;br /&gt;
ofstream fout(&amp;quot;rucsac.out&amp;quot;);&lt;br /&gt;
int a[GMAX+1];&lt;br /&gt;
int vol;&lt;br /&gt;
int n, G;                       // nr obiectelor, capacitatea rucsacului&lt;br /&gt;
int main() {&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; G;&lt;br /&gt;
&lt;br /&gt;
  a[0] = 1;                     &lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    fin &amp;gt;&amp;gt; vol;&lt;br /&gt;
    for( int j = G; j &amp;gt;= vol; j-- )&lt;br /&gt;
      if (a[j-vol]) {&lt;br /&gt;
        a[j] += a[j-vol];&lt;br /&gt;
        a[j] %= MOD;&lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  fout &amp;lt;&amp;lt; a[G] &amp;lt;&amp;lt; &#039;\n&#039;;           //   val maxima obtinua&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===[https://www.pbinfo.ro/probleme/1959/rucsac-halloween rucsac-halloween]===&lt;br /&gt;
Sabin merge la colindat de Halloween. Ştiind ca poate colinda la n case, iar la fiecare primeşte g[1], g[2], ..., g[n] bomboane, iar în rucsacul lui încap G bomboane, aflaţi numărul minim de case pe care trebuie să le colinde Sabin pentru a umple ghiozdanul. Daca nu poate umple ghiozdanul, se afiseaza mesajul &amp;quot;NU&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Solutie O(n) memorie ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
const int NMAX = 1000;        // nr maxim de obiecte&lt;br /&gt;
const int GMAX = 10000;&lt;br /&gt;
int g[NMAX + 1];              // cantitatile de bomboane&lt;br /&gt;
int a[GMAX + 1];&lt;br /&gt;
int n, G;                     // nr obiectelor, capacitatea rucsacului&lt;br /&gt;
int main() {&lt;br /&gt;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; G;&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    cin &amp;gt;&amp;gt; g[i];&lt;br /&gt;
&lt;br /&gt;
  for( int i = 1; i &amp;lt;= G; i++ )&lt;br /&gt;
    a[i] = NMAX + 1;&lt;br /&gt;
&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    for( int j = G; j &amp;gt;= g[i]; j-- ) {&lt;br /&gt;
      if( a[j] &amp;gt; a[j - g[i]] + 1 )&lt;br /&gt;
        a[j] = a[j - g[i]] + 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  if( a[G] == NMAX + 1 )&lt;br /&gt;
    cout &amp;lt;&amp;lt; &amp;quot;NU&amp;quot;;&lt;br /&gt;
  else&lt;br /&gt;
    cout &amp;lt;&amp;lt; a[G];&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tema =&lt;br /&gt;
Varena&lt;br /&gt;
* [http://varena.ro/problema/rucsac  rucsac]&lt;br /&gt;
*[https://www.varena.ro/problema/ESO ESO] Super Problema !&lt;br /&gt;
Infoarena&lt;br /&gt;
*[https://www.infoarena.ro/problema/Triunghi Triunghi]&lt;br /&gt;
*[https://www.infoarena.ro/problema/Energii Energii]&lt;br /&gt;
*[https://www.infoarena.ro/problema/Lapte Lapte]&lt;br /&gt;
*[https://www.infoarena.ro/problema/Calatorie interplanetara Calatorie interplanetara]&lt;br /&gt;
*[https://www.infoarena.ro/problema/Jocul Jocul]&lt;br /&gt;
*[https://www.infoarena.ro/problema/Ghiozdan Ghiozdan]&lt;br /&gt;
*[https://www.infoarena.ro/problema/Intensitate Intensitate]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=File:Rucsac0_1.png&amp;diff=18122</id>
		<title>File:Rucsac0 1.png</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=File:Rucsac0_1.png&amp;diff=18122"/>
		<updated>2021-03-28T20:48:51Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=11_2018&amp;diff=18120</id>
		<title>11 2018</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=11_2018&amp;diff=18120"/>
		<updated>2021-03-28T20:46:42Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;- https://www.infoarena.ro/acmunibuc_2014/1&lt;br /&gt;
* [[Clasa a XI-a lecția 1]] - Recapitulare; Test Initial&lt;br /&gt;
* [[Clasa a XI-a lecția 2]] - Backtracking iterativ: permutari, aranjamente, problema damelor, produs cartezian; Aplicatii&lt;br /&gt;
* [[Aplicatii_Permutari]]&lt;br /&gt;
* [[Clasa a XI-a lecția 3]] - Backtracking iterativ: combinari, submultimi, partitiimultime; partitiinumar; Aplicatii&lt;br /&gt;
* [[Aplicatii_Combinari]]&lt;br /&gt;
* [[Clasa a XI-a lecția 4]] - Backtracking recursiv &lt;br /&gt;
* [[Optimizarea algoritilor Backtracking]]&lt;br /&gt;
* [[Clasa a XI-a lecția 5]] - Backtracking in plan&lt;br /&gt;
* [[Clasa a XI-a lecția 6]] - Recapitulare Backtracking; &lt;br /&gt;
 * [[Test Backtracking]] - Test Backtracking; &lt;br /&gt;
* [[Clasa a XI-a lecția 7]] - Greedy&lt;br /&gt;
* [[Clasa a XI-a lecția 8]] - Greedy&lt;br /&gt;
* [[Portofolii Greedy]]&lt;br /&gt;
 * [[Probleme din portofolii corectate]]&lt;br /&gt;
 * [[Test Greedy]] - Test Greedy; &lt;br /&gt;
* [[Clasa a XI-a lecția 9]] - Dinamica&lt;br /&gt;
* [[Clasa a XI-a lecția 10]] - Dinamica -Subsir crescator maximal&lt;br /&gt;
* [[Clasa a XI-a lecția 11]] - Dinamica - Probleme diverse; Dinamica exponentiala&lt;br /&gt;
*[[Rucsac]] - Rucsac&lt;br /&gt;
 * [[Test Dinamica]] - Test Dinamica; &lt;br /&gt;
* [[Clasa a XI-a lecția 12]] - Analiza complexitatii; Recapitulare pentru teza&lt;br /&gt;
 * [[11Teza Sem1]] - S13 TEZA&lt;br /&gt;
* [[Clasa a XI-a lecția 13]] - Grafuri neorientate; Reprezentarea grafurilor prin Matrice de adiacenta, Liste de adiacenta&lt;br /&gt;
* [[Clasa a XI-a lecția 14]] - Parcurgerea grafurilor - DFS; Lant, Ciclu, Conexitate - Componente conexe, componente biconexe&lt;br /&gt;
 * [[Test DFS]] - Test  DFS, Lant, Ciclu, Conexitate - Componente conexe&lt;br /&gt;
* [[Clasa a XI-a lecția 15]] - Parcurgerea grafurilor - BFS&lt;br /&gt;
* [[Clasa a XI-a lecția 16]] - Aplicatii Parcurgerea grafurilor&lt;br /&gt;
* [[Clasa a XI-a lecția 17]] - Graf Bipartit;&lt;br /&gt;
* [[Clasa a XI-a lecția 18]] - Graf hamiltonian&lt;br /&gt;
* [[Clasa a XI-a lecția 19]] - s1 Graf eulerian &lt;br /&gt;
 * [[Test BFS]] - Test BFS; Test BFS, Lanturi minime, Graf Bipartit, Graf hamiltonian, Graf eulerian&lt;br /&gt;
* [[Clasa a XI-a lecția 20]] - s2 --&lt;br /&gt;
* [[Clasa a XI-a lecția 21]] - s3 Grafuri orientate&lt;br /&gt;
* [[Clasa a XI-a lecția 22]] - s4 Grafuri orientate: Parcurgere; &lt;br /&gt;
* [[Clasa a XI-a lecția 23]] - s5 Conexitate; Tare conexitate &lt;br /&gt;
**[[11Material_optional2]] - Sortare topologica&lt;br /&gt;
* [[Clasa a XI-a lecția 24]] - s6 Matricea drumurilor (Alg. Roy-Warshal - dc exista drum intre oricare 2 noduri )&lt;br /&gt;
* [[Clasa a XI-a lecția 25]] - s7 Grafuri ponderate; Matricea ponderilor; &lt;br /&gt;
* [[Clasa a XI-a lecția 26]] - s8 Alg. Roy Floyd - drumurile minime intre oricare 2 noduri ( n^3 )&lt;br /&gt;
* [[Clasa a XI-a lecția 27]] - s9 Alg. Dijkstra - drumurile minime de la un nod x la oricare alt nod (&lt;br /&gt;
* [[Clasa a XI-a lecția 28]] - s10 Alg. Kruskal; Alg. Prim&lt;br /&gt;
* [[Clasa a XI-a lecția 29]] - s11 Arbori cu radacina&lt;br /&gt;
* [[Clasa a XI-a lecția 30]] - s12 Recapitulare pentru teza&lt;br /&gt;
** [[11Teza Sem2 ]] - 21 mai - S13 TEZA SEM 2&lt;br /&gt;
* [[Clasa a XI-a lecția 31]] - s13 Parcurgerea arborilor cu radacina&lt;br /&gt;
 * [[Proiect Algoritmi Grafuri ponderate]] -  Shortest Path First algorithm, Minimum-spanning-tree algorithm&lt;br /&gt;
* [[Clasa a XI-a lecția 32]] - s14 &lt;br /&gt;
* [[Clasa a XI-a lecția 33]] - s15&lt;br /&gt;
* [[Clasa a XI-a lecția 34]] - s16&lt;br /&gt;
* [[Proiect Cella Florescu ]] - Kruskal&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia1&amp;diff=18037</id>
		<title>10 2018 Lectia1</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia1&amp;diff=18037"/>
		<updated>2021-02-17T16:47:08Z</updated>

		<summary type="html">&lt;p&gt;Bella: Created page with &amp;quot;= Arbori de intervale =  Vom introduce arborii de intervale prin exemple de probleme care îi folosesc. Ideea generală este să găsim o structură de date care permite inser...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Arbori de intervale =&lt;br /&gt;
&lt;br /&gt;
Vom introduce arborii de intervale prin exemple de probleme care îi folosesc. Ideea generală este să găsim o structură de date care permite inserarea și ștergerea de intervale, precum și anumite interogări despre intervale, în timp logaritmic. Prin comparație, dacă am stoca un vector de frecvență peste mulțimea coordonatelor, operațiile ar deveni O(lungimea intervalului).&lt;br /&gt;
&lt;br /&gt;
== 1D: Lungimea reuniunii a &#039;&#039;n&#039;&#039; segmente ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; segmente pe axa Ox. Să se afle lungimea reuniunii lor.&lt;br /&gt;
&lt;br /&gt;
Există diverse metode de rezolvare în O(&#039;&#039;n&#039;&#039; log &#039;&#039;n&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
* Sortăm cele 2 * &#039;&#039;n&#039;&#039; capete de segment, apoi le parcurgem, ținând evidența numărului de segmente suprapuse (incrementăm când întâlnim capătul stâng al unui segment, decrementăm la capătul drept). De câte ori contorul este pozitiv, adăugăm lungimea intervalului curent.&lt;br /&gt;
* Sortăm cele 2 * &#039;&#039;n&#039;&#039; coordonate, apoi le normalizăm la mulțimea { 1, ..., 2 * &#039;&#039;n&#039;&#039; }. Pentru fiecare element al mulțimii ținem un contor care indică numărul de segmente care acoperă acel interval. Pentru fiecare segment, incrementăm contorul pentru fiecare interval acoperit, în O(1), folosind șmenul lui Mars. La final, însumăm lungimile intervalelor acoperite de cel puțin un segment.&lt;br /&gt;
&lt;br /&gt;
Dacă coordonatele sunt întregi și cuprinse între 0 și &#039;&#039;W&#039;&#039;, atunci există și un algoritm în O(&#039;&#039;n&#039;&#039; + &#039;&#039;W&#039;&#039;) care folosește memorie O(&#039;&#039;W&#039;&#039;). Tot folosind șmenul lui Mars, pentru fiecare segment [&#039;&#039;x, y&#039;&#039;] incrementăm valorile din vector pe poziții între &#039;&#039;x&#039;&#039; și &#039;&#039;y&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Ce facem dacă dorim să calculăm lungimea reuniunii în mod dinamic? Cu alte cuvinte, să efectuăm în O(log &#039;&#039;n&#039;&#039;) operațiile:&lt;br /&gt;
&lt;br /&gt;
* adaugă un segment la colecție;&lt;br /&gt;
* elimină un segment din colecție;&lt;br /&gt;
* află lungimea reuniunii segmentelor curente.&lt;br /&gt;
&lt;br /&gt;
Această nevoie se regăsește în versiunea 2D a problemei.&lt;br /&gt;
&lt;br /&gt;
== 2D: Aria (sau perimetrul) reuniunii a &#039;&#039;n&#039;&#039; dreptunghiuri ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; dreptunghiuri în plan, cu laturile paralele cu axele. Să se afle aria (sau perimetrul) figurii rezultate.&lt;br /&gt;
&lt;br /&gt;
* prezentarea algoritmului de baleiere&lt;br /&gt;
* reducerea la o problemă 1D&lt;br /&gt;
* arbori de intervale&lt;br /&gt;
* pentru arie, avem nevoie să calculăm, la fiecare moment în cursul baleierii, reuniunea segmentelor active pe linia de baleiere&lt;br /&gt;
* pentru perimetru, avem nevoie doar de numărul de intervale (continue) acoperite de dreptunghiuri; vom calcula, separat, perimetrul pe segmente verticale și pe segmente orizontale&lt;br /&gt;
* așadar, ce stocăm în fiecare nod al arborelui?&lt;br /&gt;
&lt;br /&gt;
Complexitatea rezultată este O(&#039;&#039;n&#039;&#039; log &#039;&#039;n&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Arborele de intervale se reprezintă cel mai eficient în mod similar unui heap. Strict vorbind, când &#039;&#039;n&#039;&#039; nu este o putere a lui 2, arborele nu va fi strict; vor exista noduri lipsă pe ultimul nivel. Dacă este important, putem să extindem numărul de noduri (sau distanța maximă acoperită) până la o putere a lui 2. Numai astfel putem garanta că toate frunzele sunt pe același nivel și că fiii nodului &#039;&#039;x&#039;&#039; sunt &#039;&#039;2x&#039;&#039; și &#039;&#039;2x + 1&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Subliniem că mai există o structură cu un nume asemănător: &#039;&#039;&#039;arborele echilibrat de segmente&#039;&#039;&#039;. Acesta este un arbore echilibrat (de exemplu roșu-negru) augmentat cu informații despre segmente în fiecare nod. Această structură nu face obiectul lecției.&lt;br /&gt;
&lt;br /&gt;
== 1D: Numărul maxim de segmente suprapuse ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; segmente închise pe axa Ox. Să se afle numărul maxim de segmente suprapuse.&lt;br /&gt;
&lt;br /&gt;
Problema 1D anterioară (lungimea reuniunii) se adaptează imediat pentru această problemă.&lt;br /&gt;
&lt;br /&gt;
== 2D: Numărul maxim de dreptunghiuri suprapuse ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; dreptunghiuri închise în plan, cu laturile paralele cu axele. Să se afle numărul maxim de dreptunghiuri suprapuse.&lt;br /&gt;
&lt;br /&gt;
Algoritmul de baleiere de la problema anterioară se adaptează imediat pentru această problemă.&lt;br /&gt;
&lt;br /&gt;
== 1D: Numărul de segmente intersectate de un punct &#039;&#039;(stabbing query)&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; segmente închise pe axa Ox și &#039;&#039;m&#039;&#039; puncte pe axa Ox. Pentru fiecare punct, să se spună în câte segmente este el inclus.&lt;br /&gt;
&lt;br /&gt;
Această problemă este de tipul preprocesare + interogări. Întrucât nu avem de făcut ștergeri, ci doar inserări de segmente, putem folosi și un arbore de segmente. Complexitatea rezultată este O(&#039;&#039;n&#039;&#039; log &#039;&#039;n&#039;&#039;) pentru preprocesare și O(&#039;&#039;m&#039;&#039; log &#039;&#039;n&#039;&#039;) pentru a răspunde la interogări.&lt;br /&gt;
&lt;br /&gt;
== 2D: Numărul de dreptunghiuri intersectate de un punct &#039;&#039;(stabbing query)&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; dreptunghiuri închise în plan, cu laturile paralele cu axele, și &#039;&#039;m&#039;&#039; puncte pe axa Ox. Pentru fiecare punct, să se spună în câte dreptunghiuri este el inclus.&lt;br /&gt;
&lt;br /&gt;
Construim un arbore de intervale considerând proiecțiile segmentelor pe axa Ox. În fiecare nod din acest arbore, considerăm numai dreptunghiurile asociate cu acel nod (așadar cele care includ complet intervalul aferent nodului). În nod stocăm un arbore de intervale conținând numai acele dreptunghiuri.&lt;br /&gt;
&lt;br /&gt;
Soluția este O(&#039;&#039;n&#039;&#039; log&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &#039;&#039;n&#039;&#039;) pentru preprocesare și O(&#039;&#039;m&#039;&#039; log&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &#039;&#039;n&#039;&#039;) pentru interogări.&lt;br /&gt;
&lt;br /&gt;
== 1D: Numărul de puncte conținute de un segment &#039;&#039;(range query)&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; puncte închise pe axa Ox și &#039;&#039;m&#039;&#039; segmente pe axa Ox. Pentru fiecare segment, să se spună câte puncte conține.&lt;br /&gt;
&lt;br /&gt;
Soluția evidentă este să sortăm punctele și să facem, pentru fiecare segment, două căutări binare. Aceasta ne oferă o complexitate O(&#039;&#039;n&#039;&#039; log &#039;&#039;n&#039;&#039;) pentru preprocesare și O(log &#039;&#039;n&#039;&#039;) per interogare. Dezavantajul este că nu se poate generaliza la spațiul 2D.&lt;br /&gt;
&lt;br /&gt;
O altă soluție de aceeași complexitate se obține construind un arbore echilibrat și căutând, pentru fiecare segment [&#039;&#039;x&#039;&#039;, &#039;&#039;y&#039;&#039;], coordonatele &#039;&#039;x&#039;&#039; și &#039;&#039;y&#039;&#039; în arbore.&lt;br /&gt;
&lt;br /&gt;
== 2D: Numărul de puncte conținute de un dreptunghi &#039;&#039;(range query)&#039;&#039; ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enunț:&#039;&#039;&#039; Se dau &#039;&#039;n&#039;&#039; puncte închise pe axa Ox și &#039;&#039;m&#039;&#039; dreptunghiuri cu laturi paralele cu axele. Pentru fiecare dreptunghi, să se spună câte puncte conține.&lt;br /&gt;
&lt;br /&gt;
O primă soluție, în O(sqrt(&#039;&#039;n&#039;&#039;)) per query, construiește un arbore kD (prescurtare de la &#039;&#039;k&#039;&#039;-dimensional). În cazul nostru, &#039;&#039;k&#039;&#039; = 2. Divizăm binar spațiul prin tăieturi alternative, verticale și orizontale. Obținem astfel celule dreptunghiulare, posibil nemărginite. În frunze se află celule cu exact un punct.&lt;br /&gt;
&lt;br /&gt;
* Cum construim arborele kD în O(&#039;&#039;n&#039;&#039; log &#039;&#039;n&#039;&#039;)? Care este relația de recurență?&lt;br /&gt;
* Cum răspundem la o interogare? Există următoarele cazuri:&lt;br /&gt;
** celula &#039;&#039;v&#039;&#039; este o frunză&lt;br /&gt;
** celula &#039;&#039;v&#039;&#039; este inclusă în dreptunghi&lt;br /&gt;
** celula &#039;&#039;v&#039;&#039; este disjunctă de dreptunghi&lt;br /&gt;
** alte cazuri&lt;br /&gt;
* Care este complexitatea?&lt;br /&gt;
** De interes sunt celulele care se intersectează cu dreptunghiul. Câte astfel de celule există?&lt;br /&gt;
** Să considerăm o latură a dreptunghiului și două partiții succesive ale spațiului (una verticală, una orizontală)&lt;br /&gt;
** Rezultă formula de recurență pentru numărul de intersecții: I(&#039;&#039;n&#039;&#039;) = 2 I(&#039;&#039;n&#039;&#039;/4) + 2, adică I(n) = O(sqrt(&#039;&#039;n&#039;&#039;))&lt;br /&gt;
&lt;br /&gt;
O a doua soluție, considerabil mai dificil de implementat, recurge din nou la arbori de intervale pe două niveluri. Construim un arbore de intervale după coordonata X. În fiecare nod &#039;&#039;v&#039;&#039; stocăm arborele de intervale al tuturor punctelor conținute în subarborele lui &#039;&#039;v&#039;&#039;, ordonate de această dată după coordonata Y.&lt;br /&gt;
&lt;br /&gt;
Complexitatea rezultată este O(&#039;&#039;n&#039;&#039; log&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt; &#039;&#039;n&#039;&#039;), iar memoria necesară O(&#039;&#039;n&#039;&#039; log &#039;&#039;n&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Problema Arbint (Infoarena) ==&lt;br /&gt;
&lt;br /&gt;
Arborii de intervale pot fi utili și pentru probleme care nu implică direct intervale, ca în problema [http://www.infoarena.ro/problema/arbint Arbint]. Ce stochează în acest caz arborele de intervale?&lt;br /&gt;
[[Image:aint.jpg|frame|none|Structura arborelui de intervale]]&lt;br /&gt;
&lt;br /&gt;
Arborele de intervale este o structura de date definita in modul urmator:&lt;br /&gt;
&lt;br /&gt;
Consideram un arbore in care fiecare nod are atribuit un interval, radacinii arborelui fiindu-i atribuit intervalul maxim, [0, n - 1].&lt;br /&gt;
Apoi, pentru fiecare frunza a arborelui (cu intervalul [l, r]), efectuam urmatoarele operatii:&lt;br /&gt;
* Daca l != r, cream un fiu stang si un fiu drept al nodului curent. &lt;br /&gt;
* Fiului stang ii atribuim intervalul [l, (l + r) / 2]&lt;br /&gt;
* Fiului drept ii atribuim intervalul [(l + r) / 2 + 1, r]&lt;br /&gt;
Procesul descris se opreste in momentul in care toate frunzele arborelui corespund unui interval format dintr-un singur numar.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#define MAXN 100000&lt;br /&gt;
 &lt;br /&gt;
int v[1 + MAXN];&lt;br /&gt;
int aint[1 + 4 * MAXN];&lt;br /&gt;
 &lt;br /&gt;
inline int maxim(int a, int b){&lt;br /&gt;
    return a &amp;gt; b ? a : b;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int poz, val;&lt;br /&gt;
void update(int p, int st, int dr){ //cautam pozitia poz in intervalul [st, dr], care apare in vector pe pozitia p&lt;br /&gt;
    if(st == dr) //daca am ajuns la pozitia cautata, updatam valoarea tinuta de aint&lt;br /&gt;
        aint[p] = val;&lt;br /&gt;
    else{&lt;br /&gt;
        int m = (st + dr) / 2;&lt;br /&gt;
        if(poz &amp;lt;= m) update(2 * p, st, m);          //daca valoarea cautata este in intervalul [st, m], restrangem cautarea pe intervalul respectiv&lt;br /&gt;
        else         update(2 * p + 1, m + 1, dr);  //daca valoarea cautata este in intervalul [m + 1, dr], restrangem cautarea pe intervalul respectiv&lt;br /&gt;
        aint[p] = maxim(aint[2 * p], aint[2 * p + 1]); //updatam raspunsul tinut de nodul nostru intermediar&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int left, right;&lt;br /&gt;
int rez;&lt;br /&gt;
void query(int p, int st, int dr){&lt;br /&gt;
    if(st &amp;gt;= left &amp;amp;&amp;amp; dr &amp;lt;= right) //daca intervalul curent este inclus in intervalul cautat, procesam informatia&lt;br /&gt;
        rez = maxim(rez, aint[p]);&lt;br /&gt;
    else{&lt;br /&gt;
        int m = (st + dr) / 2;&lt;br /&gt;
        if(left &amp;lt;= m) query(2 * p, st, m);         // daca intervalul cautat intersecteaza [st, m], cautam in [st, m]&lt;br /&gt;
        if(right &amp;gt; m) query(2 * p + 1, m + 1, dr); //daca intervalul cautat intersecteaza [m + 1, dr], cautam in [m + 1, dr]&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main(){&lt;br /&gt;
    int n, m;&lt;br /&gt;
    FILE*fi,*fo;&lt;br /&gt;
    fi=fopen(&amp;quot;arbint.in&amp;quot;,&amp;quot;r&amp;quot;);&lt;br /&gt;
    fo=fopen(&amp;quot;arbint.out&amp;quot;,&amp;quot;w&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    fscanf(fi,&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;m);&lt;br /&gt;
    for(int i = 1; i &amp;lt;= n; i++){&lt;br /&gt;
        fscanf(fi,&amp;quot;%d&amp;quot;, &amp;amp;v[i]);&lt;br /&gt;
        poz = i, val = v[i];&lt;br /&gt;
        update(1, 1, n);&lt;br /&gt;
    }&lt;br /&gt;
    for(int i=1;i&amp;lt;=m;i++){&lt;br /&gt;
        int c, a, b;&lt;br /&gt;
        fscanf(fi,&amp;quot;%d%d%d&amp;quot;, &amp;amp;c, &amp;amp;a, &amp;amp;b);&lt;br /&gt;
        if(c == 0){&lt;br /&gt;
            left = a, right = b, rez = 0;&lt;br /&gt;
            query(1, 1, n);&lt;br /&gt;
            fprintf(fo,&amp;quot;%d\n&amp;quot;, rez);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            poz = a, val = b;&lt;br /&gt;
            update(1, 1, n);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Sursa Tinca Matei&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
// Constantele din problema&lt;br /&gt;
const int MAX_N = 8;&lt;br /&gt;
const int MAX_2N = 2 * MAX_N;&lt;br /&gt;
&lt;br /&gt;
// Starea dinamicii&lt;br /&gt;
double best[1 &amp;lt;&amp;lt; MAX_2N];&lt;br /&gt;
&lt;br /&gt;
// Punctele din problema&lt;br /&gt;
int x[MAX_2N], y[MAX_2N];&lt;br /&gt;
&lt;br /&gt;
double dist(double xa, double ya, double xb, double yb) {&lt;br /&gt;
    return sqrt((xa - xb) * (xa - xb) + (ya - yb) * (ya - yb));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
    int n;&lt;br /&gt;
    FILE *fin = fopen(&amp;quot;xd.in&amp;quot;, &amp;quot;r&amp;quot;);&lt;br /&gt;
    fscanf(fin, &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    for(int i = 0; i &amp;lt; 2 * n; ++i)&lt;br /&gt;
        fscanf(fin, &amp;quot;%d%d&amp;quot;, &amp;amp;x[i], &amp;amp;y[i]);&lt;br /&gt;
    fclose(fin);&lt;br /&gt;
&lt;br /&gt;
    // Initializam totul cu infinit&lt;br /&gt;
    for(int i = 0; i &amp;lt; (1 &amp;lt;&amp;lt; MAX_2N); ++i)&lt;br /&gt;
        best[i] = 1000000000.0f;&lt;br /&gt;
    best[0] = 0.0f;&lt;br /&gt;
&lt;br /&gt;
    // Aplicam formula de recurenta&lt;br /&gt;
    for(int mask = 1; mask &amp;lt; (1 &amp;lt;&amp;lt; (2 * n)); ++mask) {&lt;br /&gt;
        for(int i = 0; i &amp;lt; 2 * n; ++i)&lt;br /&gt;
            for(int j = i + 1; j &amp;lt; 2 * n; ++j)&lt;br /&gt;
                if((mask &amp;amp; (1 &amp;lt;&amp;lt; i)) &amp;gt; 0 &amp;amp;&amp;amp; (mask &amp;amp; (1 &amp;lt;&amp;lt; j)) &amp;gt; 0)&lt;br /&gt;
                    best[mask] = min(best[mask], best[mask ^ (1 &amp;lt;&amp;lt; i) ^ (1 &amp;lt;&amp;lt; j)] +&lt;br /&gt;
                                                 dist(x[i], y[i], x[j], y[j]));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    FILE *fout = fopen(&amp;quot;xd.out&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
    fprintf(fout, &amp;quot;%.10f&amp;quot;, best[(1 &amp;lt;&amp;lt; (2 * n)) - 1]);&lt;br /&gt;
    fclose(fout);&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fie dp[multime]&lt;br /&gt;
Recurenta este urmatoarea:&lt;br /&gt;
dp[mask] = min(dp[mask \ {i, j}] + dist(i, j) unde i si j apartin multimii mask si i != j)&lt;br /&gt;
&lt;br /&gt;
*/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aplicatii ==&lt;br /&gt;
* [https://infoarena.ro/problema/arbint arbint] [http://isa.algopedia.ro/wiki/index.php/arbint Rez]&lt;br /&gt;
* [https://infoarena.ro/problema/datorii datorii] [http://isa.algopedia.ro/wiki/index.php/datorii Rez]&lt;br /&gt;
* [https://infoarena.ro/problema/sequencequery sequencequery] [http://isa.algopedia.ro/wiki/index.php/sequencequery Rez]&lt;br /&gt;
* [https://infoarena.ro/problema/maxq maxq] [http://isa.algopedia.ro/wiki/index.php/maxq Rez]&lt;br /&gt;
* [https://infoarena.ro/problema/farfurii farfurii] [http://isa.algopedia.ro/wiki/index.php/farfurii Rez]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_23&amp;diff=18036</id>
		<title>Clasa a IX-a lecția 23</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_23&amp;diff=18036"/>
		<updated>2021-02-10T14:30:32Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note de curs: prof. Isabela Coman &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Sume partiale == &lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1933 sume2]&lt;br /&gt;
Fie N un numar natural și un șir de N numere naturale V[1], V[2], …, V[N]. Pentru M întrebări de forma (i,j), să se calculeze suma termenilor V[i], V[i + 1], …, V[j].&lt;br /&gt;
&lt;br /&gt;
! ATENTIE ! Adunam n numere. De ce tip va fi suma?&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
long long S[100000];&lt;br /&gt;
int main(){&lt;br /&gt;
    FILE *fin, *fout;&lt;br /&gt;
    long long n, m, i, j, x;&lt;br /&gt;
    fin = fopen ( &amp;quot;sume2.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
    fscanf ( fin, &amp;quot;%lld&amp;quot;, &amp;amp;n );&lt;br /&gt;
    fout = fopen ( &amp;quot;sume2.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
    for ( i = 1; i &amp;lt;= n; i ++ ){&lt;br /&gt;
       fscanf ( fin, &amp;quot;%lld&amp;quot;, &amp;amp;x );&lt;br /&gt;
       S[i] = S[i-1] + x;&lt;br /&gt;
    }&lt;br /&gt;
    fscanf ( fin, &amp;quot;%lld&amp;quot;, &amp;amp;m );&lt;br /&gt;
    for ( int k = 1; k &amp;lt;= m; k ++ ){&lt;br /&gt;
       fscanf ( fin, &amp;quot;%lld%lld&amp;quot;, &amp;amp;i, &amp;amp;j );&lt;br /&gt;
       fprintf ( fout, &amp;quot;%lld\n&amp;quot;, S[j] - S[i-1] );&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Smenul lui Mars == &lt;br /&gt;
&lt;br /&gt;
Se consideră un tablou unidimensional cu n elemente numere întregi, numerotate de la 1 la n, inițial toate nule. Asupra tabloului se fac m operații s d X cu semnificația: toate elementele cu indici cuprinși între s și d își măresc valoare cu X. Să se afișeze tabloul după realizarea celor m operații.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Folosim smenul lu Mars&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Declaram vectorul global, pentru a fi initializat cu 0. El are 2 elemente in plus deoarece, pozitia 1 nu o folosim, iar pozitia n + 1 o vom marca ca sfarsit de interval, in caz ca am un interval cu limita egala cu n.&lt;br /&gt;
int v[200002];         &lt;br /&gt;
int main(){&lt;br /&gt;
   int n, m, i, a, b, x;&lt;br /&gt;
   &lt;br /&gt;
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;m );&lt;br /&gt;
   for(i = 1; i &amp;lt;= m; i++ ){&lt;br /&gt;
      scanf( &amp;quot;%d%d%d&amp;quot;, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;br /&gt;
      v[a] += x;               // a este prima pozitie unde vom aduna x&lt;br /&gt;
      v[b+1] -= x;             // b+1 este prima pozitie unde nu voi mai aduna x &lt;br /&gt;
   }&lt;br /&gt;
    &lt;br /&gt;
   for( i = 1; i &amp;lt;= n; i++ ){  // pt fiec poz v[i] voi calcula o suma a tuturor marcajelor de pana la pozitia v[i]&lt;br /&gt;
      v[i] += v[i-1];&lt;br /&gt;
      printf( &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=497 Element majoritar] == &lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Verificați dacă vectorul are un element majoritar. Numim element majoritar o valoare pentru care numărul de apariții în vector este mai mare decât n/2.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int v[100000];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, cnt, maj;&lt;br /&gt;
&lt;br /&gt;
  // citim sirul de valori&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  maj = v[0];              // presupunem ca prima valoare e majoritara&lt;br /&gt;
  cnt = 1;                  // pana acum a aparut o data&lt;br /&gt;
  for ( i = 1; i &amp;lt; n; i++ )&lt;br /&gt;
    if ( v[i] == maj )    // daca am gasit o val egala cu majoritarul&lt;br /&gt;
      cnt++;               // cresc cnt de elem majoritar&lt;br /&gt;
    else {&lt;br /&gt;
      cnt--;               // altfel decrementam numarul de elem maj&lt;br /&gt;
      if ( cnt &amp;lt; 0 ) {     // daca am scazut sub zero&lt;br /&gt;
        maj = v[i];       // schimbam elementul presupus ca majoritar&lt;br /&gt;
        cnt = 1;           // resetam contorul elem majorita&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  // verificare candidat la element majoritar&lt;br /&gt;
  cnt = 0;&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ ) // numaram de cit ori apare maj in vector&lt;br /&gt;
    if ( v[i] == maj )&lt;br /&gt;
      cnt++;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if ( cnt &amp;gt; n / 2 ) // daca maj apare de mai mult de n/2 ori este majoritar&lt;br /&gt;
    printf( &amp;quot;DA %d\n&amp;quot;, maj );&lt;br /&gt;
  else&lt;br /&gt;
    printf( &amp;quot;NU\n&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Two pointers == &lt;br /&gt;
&lt;br /&gt;
Fie N un numar natural și un șir de N numere naturale V[1], V[2], …, V[N] in ordine crescatoare. Sa se puna daca exista 2 elemente din vector a caror suma sa fie egala cu x.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// solutie naiva O(n^2):luam toate perechile de 2 elemente si calculam suma lor&lt;br /&gt;
ok = 0;&lt;br /&gt;
for (i = 0; i &amp;lt; N; i++) { &lt;br /&gt;
  for (j = 0; j &amp;lt; N; j++) { &lt;br /&gt;
    if (A[i] + A[j] == X) &lt;br /&gt;
       ok = 1;         // am gasit o pereche &lt;br /&gt;
       if (A[i] + A[j] &amp;gt; X) &lt;br /&gt;
          break;      // daca suma a devenit mai mare ca x, intrerup cautarea&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// solutie O(n): vom folosi 2 pozitii in vactor, initial extremitatile sirului (2 pointeri) cu care ne vom apropia de sol corecta&lt;br /&gt;
&lt;br /&gt;
    int i = 0;      // represents first pointer   &lt;br /&gt;
    int j = N - 1;  // represents second pointer   &lt;br /&gt;
    gasit = 0;&lt;br /&gt;
    while (i &amp;lt; j) {   &lt;br /&gt;
        if ( A[i] + A[j] == X )    // Daca gasim o pereche &lt;br /&gt;
            gasit = 1;   &lt;br /&gt;
        else if (A[i] + A[j] &amp;lt; X ) // Dc suma e mai mica, ne mutam cu i pe un element mai mare &lt;br /&gt;
            i++; &lt;br /&gt;
        else                       // Dc suma e mai mare, ne mutam cu j pe un element mai mic  &lt;br /&gt;
            j--; &lt;br /&gt;
    } &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Algoritmul se bazeaza pe faptul ca sirul este sortat. Pornim cu suma primului si ultimului element. Daca avem o suma mai mica decat cea pe care dorim sa o obtinem, atunci alegem urmatorul element de dupa A[i], daca suma e mai mare atunci alegem un element mai mic decat A[j]. In functie de suma rezultata, vom ajusta pozitiile celor 2 pointeri pas cu pas, pana cand fie gasim o pereche, fie pozitia lui i devine mai mare decat cea a lui j, semn ca am testat toate perechile posibile.&lt;br /&gt;
&lt;br /&gt;
https://tp-iiita.quora.com/The-Two-Pointer-Algorithm&lt;br /&gt;
&lt;br /&gt;
= Laborator =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme cu sume partiale ==&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=134 SecvK]  ===&lt;br /&gt;
Se dă un șir cu n numere naturale și un număr k. Să se determine o secvență de elemente de lungime k cu suma elementelor maximă.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=300 SumaInSecv]===&lt;br /&gt;
Se dă un vector format din n elemente, numere naturale nenule, şi un număr natural S. Determinaţi, dacă există o secvenţă de elemente din şir cu suma elementelor egală cu S.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=134 SumeSecv]  ===&lt;br /&gt;
Se dă un vector cu n elemente numere naturale, numerotate de la 1 la n, și m perechi de indici (i,j), cu 1≤i&amp;lt;j≤n. Să se determine, pentru pereche (i,j), suma elementelor din secvenţa determinată de i şi j.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2921 SumeSecv1]===&lt;br /&gt;
Se dă un șir cu n elemente numere naturale, numerotate de la 1 la n și m perechi de indici i j. Pentru fiecare pereche de indici se calculează suma elementelor din secvență determinată de cei doi indici. Afișați suma maximă obținută.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2236 swap01]  ===&lt;br /&gt;
Se consideră un șir binar a[1], a[2], …, a[n]. Asupra șirului se poate efectua operația swap(i, j) prin care se interschimbă valorile a[i] și a[j]. Să se determine numărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir.&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1364 produs3] === &lt;br /&gt;
!!!Problema Grea&lt;br /&gt;
Sume partiale, XOR, baza 2, gauss&lt;br /&gt;
&lt;br /&gt;
== Probleme cu smenul lui Mars ==&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1233 Paint]  ===&lt;br /&gt;
Roberto are suflet de artist. El visează să ajungă într-o bună zi un pictor celebru, dar pentru moment își câştigă existența ca zugrav. &lt;br /&gt;
Roberto a primit sarcina de a zugrăvi un zid având lungimea n metri şi înălţimea un metru. Pentru aceasta are la dispoziţie m zile. În fiecare zi i, el acoperă cu un singur strat de vopsea o porţiune compactă de înălțime un metru și de lungime l[i] metri, începând de la distanţa d[i] metri faţă de capătul din stânga al zidului. &lt;br /&gt;
Roberto ştie din experienţă că fiecare porţiune de zid trebuie acoperită cu cel puţin K straturi de vopsea pentru ca stratul final de vopsea să aibă consistenţa dorită. Din nefericire, firea lui de artist nu i-a permis să-şi poată planifica munca în mod optim, astfel că la capătul celor m zile de efort, Roberto a constatat că zidul are porţiuni pe care le-a acoperit de mai mult de k ori şi alte porţiuni pe care le-a acoperit de mai puţin de k ori.&lt;br /&gt;
Pentru a recupera în proprii săi ochi dar mai ales în ochii şefului de echipă, el trebuie să afle mai întâi suprafaţa totală a tuturor porţiunilor de zid care mai trebuie zugrăvite.&lt;br /&gt;
Cunoscând lungimea zidului n, numărul de zile m şi porţiunile compacte pe care le zugrăveşte în fiecare zi, determinaţi suprafaţa totală a zidului care mai trebuie zugrăvită.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/probleme/1222/tv TV]===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
#define MAXSEC 60*60*24&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int v[MAXSEC];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin = fopen ( &amp;quot;tv.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  FILE *fout = fopen ( &amp;quot;tv.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  int cer, n, i, d, h, m, s, start;&lt;br /&gt;
&lt;br /&gt;
  fscanf ( fin, &amp;quot;%d%d&amp;quot;, &amp;amp;cer, &amp;amp;n );&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
      fscanf ( fin, &amp;quot;%d %d:%d:%d&amp;quot;, &amp;amp;d, &amp;amp;h, &amp;amp;m, &amp;amp;s );&lt;br /&gt;
      start = h * 60 * 60 + m * 60 + s;&lt;br /&gt;
      v[start] ++;&lt;br /&gt;
      v[start + d] --;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Presupunem ca secunda de aur este 0 ( 00:00:00 )&lt;br /&gt;
  int poz = 0;          // secunda de aur&lt;br /&gt;
  int vmax = v[0];      // nr maxim de posturi care emit publicitate intr-o secunda&lt;br /&gt;
&lt;br /&gt;
  int nr_sec;       // nr sec fara publicitate&lt;br /&gt;
  if ( v[0] == 0 )&lt;br /&gt;
    nr_sec = 1;&lt;br /&gt;
  else&lt;br /&gt;
    nr_sec = 0;&lt;br /&gt;
  for ( i = 1; i &amp;lt; MAXSEC; i++ ) {&lt;br /&gt;
    v[i] += v[i - 1];&lt;br /&gt;
    if ( v[i] == 0 )&lt;br /&gt;
        nr_sec ++;&lt;br /&gt;
    if ( v[i] &amp;gt; vmax ){&lt;br /&gt;
        vmax = v[i];&lt;br /&gt;
        poz = i;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( cer == 2 )&lt;br /&gt;
    nr_sec = poz;&lt;br /&gt;
  fprintf ( fout, &amp;quot;%02d:%02d:%02d&amp;quot;, nr_sec / 3600, nr_sec % 3600 / 60, nr_sec % 60 );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1062 Flori1]===&lt;br /&gt;
&lt;br /&gt;
===twoop  ===&lt;br /&gt;
Se dă un șir de N elemente, numere întregi. Pe acest șir se aplică operații de două tipuri : &lt;br /&gt;
Tip 1: st dr val – elementele de pe pozițiile din intervalul [st, dr] cresc cu valoarea val&lt;br /&gt;
Tip 2: poz – să se afișeze valoarea elementului de pe poziția poz .&lt;br /&gt;
Dându-se șirul de elemente și operațiile, aplicați operațiile pe șir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme cu element majoritar == &lt;br /&gt;
* http://varena.ro/problema/proiecte   ( element majoritar )&lt;br /&gt;
&lt;br /&gt;
== Probleme cu two pointers  ==&lt;br /&gt;
===Memory006  ===&lt;br /&gt;
Se dă un şir de numere naturale nenule. Să se afle numărul secvenţelor din şir care au produsul elementelor egal cu 2k, unde k este un număr dat.&lt;br /&gt;
 &lt;br /&gt;
===#1350 produs2 ===&lt;br /&gt;
 &lt;br /&gt;
Se consideră un şir cu elemente numere naturale nenule. Să se afle câte secvenţe din şir au produsul mai mic decât un număr dat.&lt;br /&gt;
&lt;br /&gt;
===#2405 politic===&lt;br /&gt;
  &lt;br /&gt;
În Țara lui Papură Vodă s-au organizat de curând primele alegeri democratice. A rezultat astfel un parlament din care fac parte deputați cu diverse doctrine politice, de stânga sau de dreapta. Acestea sunt descrise prin numere naturale nenule (orientarea politică este cu atât mai de stânga cu cât numărul este mai mic). Parlamentarii s-au asociat în partide politice în funcție de doctrina fiecăruia. Oricare doi deputați ale căror doctrine corespund unor numere consecutive fac parte din același partid. Prin urmare, partidele vor fi alcătuite din deputați ale căror doctrine sunt numere consecutive. (De exemplu, dacă parlamentul are 5 deputați, cu doctrinele 1, 2, 3, 5 şi 6, atunci înseamnă că aceștia sunt grupați în două partide: unul format din 1, 2 și 3 și altul din 5 și 6.)&lt;br /&gt;
Un guvern trebuie să beneficieze de susținerea a mai mult de jumătate dintre parlamentari. De exemplu, dacă parlamentul este format din 7 deputați, atunci un guvern are nevoie de susținerea a cel puțin 4 deputați.&lt;br /&gt;
Pentru a putea guverna, partidele se pot grupa in coaliţii. Regula după care se asociază este urmatoarea: două partide A şi B, A având o doctrină mai de stânga, pot face parte din aceeași coaliţie doar dacă din coaliţia respectivă fac parte toate partidele a căror doctrină este mai de dreapta decât cea a lui A şi mai de stânga decât cea a lui B. De exemplu, dacă parlamentul este alcătuit din deputaţi cu orientările politice 1, 2, 4, 5, 7 şi 8, atunci partidul format din 1 şi 2 nu se poate asocia cu partidul format din 7 şi 8 decât dacă din coaliţia respectivă face parte şi partidul format din 4 şi 5.&lt;br /&gt;
Fiind dat parlamentul din Ţara lui Papură Vodă printr-un şir ordonat strict crescător de numere naturale nenule, se cere să se stabilească numărul de partide parlamentare şi numărul variantelor de coaliţie majoritară.&lt;br /&gt;
ONI Gimnaziu 2007&lt;br /&gt;
&lt;br /&gt;
===#1471 maxdiv === &lt;br /&gt;
Scrieţi un program care afişează, pentru un şir dat format din n numere naturale numărul de secvenţe maxdiv şi cea mai lungă secvenţă maxdiv.&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
Rezolvati problemele de la secvente, ramase nerezolvate, din fisa de laborator&lt;br /&gt;
&#039;&#039;&#039;Note de curs: prof. Isabela Coman &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Sume partiale == &lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1933 sume2]&lt;br /&gt;
Fie N un numar natural și un șir de N numere naturale V[1], V[2], …, V[N]. Pentru M întrebări de forma (i,j), să se calculeze suma termenilor V[i], V[i + 1], …, V[j].&lt;br /&gt;
&lt;br /&gt;
! ATENTIE ! Adunam n numere. De ce tip va fi suma?&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
long long S[100000];&lt;br /&gt;
int main(){&lt;br /&gt;
    FILE *fin, *fout;&lt;br /&gt;
    long long n, m, i, j, x;&lt;br /&gt;
    fin = fopen ( &amp;quot;sume2.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
    fscanf ( fin, &amp;quot;%lld&amp;quot;, &amp;amp;n );&lt;br /&gt;
    fout = fopen ( &amp;quot;sume2.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
    for ( i = 1; i &amp;lt;= n; i ++ ){&lt;br /&gt;
       fscanf ( fin, &amp;quot;%lld&amp;quot;, &amp;amp;x );&lt;br /&gt;
       S[i] = S[i-1] + x;&lt;br /&gt;
    }&lt;br /&gt;
    fscanf ( fin, &amp;quot;%lld&amp;quot;, &amp;amp;m );&lt;br /&gt;
    for ( int k = 1; k &amp;lt;= m; k ++ ){&lt;br /&gt;
       fscanf ( fin, &amp;quot;%lld%lld&amp;quot;, &amp;amp;i, &amp;amp;j );&lt;br /&gt;
       fprintf ( fout, &amp;quot;%lld\n&amp;quot;, S[j] - S[i-1] );&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Smenul lui Mars == &lt;br /&gt;
&lt;br /&gt;
Se consideră un tablou unidimensional cu n elemente numere întregi, numerotate de la 1 la n, inițial toate nule. Asupra tabloului se fac m operații s d X cu semnificația: toate elementele cu indici cuprinși între s și d își măresc valoare cu X. Să se afișeze tabloul după realizarea celor m operații.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Folosim smenul lu Mars&lt;br /&gt;
#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Declaram vectorul global, pentru a fi initializat cu 0. El are 2 elemente in plus deoarece, pozitia 1 nu o folosim, iar pozitia n + 1 o vom marca ca sfarsit de interval, in caz ca am un interval cu limita egala cu n.&lt;br /&gt;
int v[200002];         &lt;br /&gt;
int main(){&lt;br /&gt;
   int n, m, i, a, b, x;&lt;br /&gt;
   &lt;br /&gt;
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;m );&lt;br /&gt;
   for(i = 1; i &amp;lt;= m; i++ ){&lt;br /&gt;
      scanf( &amp;quot;%d%d%d&amp;quot;, &amp;amp;a, &amp;amp;b, &amp;amp;x);&lt;br /&gt;
      v[a] += x;               // a este prima pozitie unde vom aduna x&lt;br /&gt;
      v[b+1] -= x;             // b+1 este prima pozitie unde nu voi mai aduna x &lt;br /&gt;
   }&lt;br /&gt;
    &lt;br /&gt;
   for( i = 1; i &amp;lt;= n; i++ ){  // pt fiec poz v[i] voi calcula o suma a tuturor marcajelor de pana la pozitia v[i]&lt;br /&gt;
      v[i] += v[i-1];&lt;br /&gt;
      printf( &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
   }&lt;br /&gt;
   return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=497 Element majoritar] == &lt;br /&gt;
Se dă un vector cu n elemente, numere naturale. Verificați dacă vectorul are un element majoritar. Numim element majoritar o valoare pentru care numărul de apariții în vector este mai mare decât n/2.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int v[100000];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, cnt, maj;&lt;br /&gt;
&lt;br /&gt;
  // citim sirul de valori&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  maj = v[0];              // presupunem ca prima valoare e majoritara&lt;br /&gt;
  cnt = 1;                  // pana acum a aparut o data&lt;br /&gt;
  for ( i = 1; i &amp;lt; n; i++ )&lt;br /&gt;
    if ( v[i] == maj )    // daca am gasit o val egala cu majoritarul&lt;br /&gt;
      cnt++;               // cresc cnt de elem majoritar&lt;br /&gt;
    else {&lt;br /&gt;
      cnt--;               // altfel decrementam numarul de elem maj&lt;br /&gt;
      if ( cnt &amp;lt; 0 ) {     // daca am scazut sub zero&lt;br /&gt;
        maj = v[i];       // schimbam elementul presupus ca majoritar&lt;br /&gt;
        cnt = 1;           // resetam contorul elem majorita&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  // verificare candidat la element majoritar&lt;br /&gt;
  cnt = 0;&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ ) // numaram de cit ori apare maj in vector&lt;br /&gt;
    if ( v[i] == maj )&lt;br /&gt;
      cnt++;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  if ( cnt &amp;gt; n / 2 ) // daca maj apare de mai mult de n/2 ori este majoritar&lt;br /&gt;
    printf( &amp;quot;DA %d\n&amp;quot;, maj );&lt;br /&gt;
  else&lt;br /&gt;
    printf( &amp;quot;NU\n&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Two pointers == &lt;br /&gt;
&lt;br /&gt;
Fie N un numar natural și un șir de N numere naturale V[1], V[2], …, V[N] in ordine crescatoare. Sa se puna daca exista 2 elemente din vector a caror suma sa fie egala cu x.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// solutie naiva O(n^2):luam toate perechile de 2 elemente si calculam suma lor&lt;br /&gt;
ok = 0;&lt;br /&gt;
for (i = 0; i &amp;lt; N; i++) { &lt;br /&gt;
  for (j = 0; j &amp;lt; N; j++) { &lt;br /&gt;
    if (A[i] + A[j] == X) &lt;br /&gt;
       ok = 1;         // am gasit o pereche &lt;br /&gt;
       if (A[i] + A[j] &amp;gt; X) &lt;br /&gt;
          break;      // daca suma a devenit mai mare ca x, intrerup cautarea&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// solutie O(n): vom folosi 2 pozitii in vactor, initial extremitatile sirului (2 pointeri) cu care ne vom apropia de sol corecta&lt;br /&gt;
&lt;br /&gt;
    int i = 0;      // represents first pointer   &lt;br /&gt;
    int j = N - 1;  // represents second pointer   &lt;br /&gt;
    gasit = 0;&lt;br /&gt;
    while (i &amp;lt; j) {   &lt;br /&gt;
        if ( A[i] + A[j] == X )    // Daca gasim o pereche &lt;br /&gt;
            gasit = 1;   &lt;br /&gt;
        else if (A[i] + A[j] &amp;lt; X ) // Dc suma e mai mica, ne mutam cu i pe un element mai mare &lt;br /&gt;
            i++; &lt;br /&gt;
        else                       // Dc suma e mai mare, ne mutam cu j pe un element mai mic  &lt;br /&gt;
            j--; &lt;br /&gt;
    } &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Algoritmul se bazeaza pe faptul ca sirul este sortat. Pornim cu suma primului si ultimului element. Daca avem o suma mai mica decat cea pe care dorim sa o obtinem, atunci alegem urmatorul element de dupa A[i], daca suma e mai mare atunci alegem un element mai mic decat A[j]. In functie de suma rezultata, vom ajusta pozitiile celor 2 pointeri pas cu pas, pana cand fie gasim o pereche, fie pozitia lui i devine mai mare decat cea a lui j, semn ca am testat toate perechile posibile.&lt;br /&gt;
&lt;br /&gt;
https://tp-iiita.quora.com/The-Two-Pointer-Algorithm&lt;br /&gt;
&lt;br /&gt;
= Laborator =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme cu sume partiale ==&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=134 SecvK]  ===&lt;br /&gt;
Se dă un șir cu n numere naturale și un număr k. Să se determine o secvență de elemente de lungime k cu suma elementelor maximă.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=300 SumaInSecv]===&lt;br /&gt;
Se dă un vector format din n elemente, numere naturale nenule, şi un număr natural S. Determinaţi, dacă există o secvenţă de elemente din şir cu suma elementelor egală cu S.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=134 SumeSecv]  ===&lt;br /&gt;
Se dă un vector cu n elemente numere naturale, numerotate de la 1 la n, și m perechi de indici (i,j), cu 1≤i&amp;lt;j≤n. Să se determine, pentru pereche (i,j), suma elementelor din secvenţa determinată de i şi j.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2921 SumeSecv1]===&lt;br /&gt;
Se dă un șir cu n elemente numere naturale, numerotate de la 1 la n și m perechi de indici i j. Pentru fiecare pereche de indici se calculează suma elementelor din secvență determinată de cei doi indici. Afișați suma maximă obținută.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2236 swap01]  ===&lt;br /&gt;
Se consideră un șir binar a[1], a[2], …, a[n]. Asupra șirului se poate efectua operația swap(i, j) prin care se interschimbă valorile a[i] și a[j]. Să se determine numărul minim de operații swap care pot fi efectuate astfel încât toate valorile de 1 să apară pe poziții consecutive în șir.&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1364 produs3] === &lt;br /&gt;
!!!Problema Grea&lt;br /&gt;
Sume partiale, XOR, baza 2, gauss&lt;br /&gt;
&lt;br /&gt;
== Probleme cu smenul lui Mars ==&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1233 Paint]  ===&lt;br /&gt;
Roberto are suflet de artist. El visează să ajungă într-o bună zi un pictor celebru, dar pentru moment își câştigă existența ca zugrav. &lt;br /&gt;
Roberto a primit sarcina de a zugrăvi un zid având lungimea n metri şi înălţimea un metru. Pentru aceasta are la dispoziţie m zile. În fiecare zi i, el acoperă cu un singur strat de vopsea o porţiune compactă de înălțime un metru și de lungime l[i] metri, începând de la distanţa d[i] metri faţă de capătul din stânga al zidului. &lt;br /&gt;
Roberto ştie din experienţă că fiecare porţiune de zid trebuie acoperită cu cel puţin K straturi de vopsea pentru ca stratul final de vopsea să aibă consistenţa dorită. Din nefericire, firea lui de artist nu i-a permis să-şi poată planifica munca în mod optim, astfel că la capătul celor m zile de efort, Roberto a constatat că zidul are porţiuni pe care le-a acoperit de mai mult de k ori şi alte porţiuni pe care le-a acoperit de mai puţin de k ori.&lt;br /&gt;
Pentru a recupera în proprii săi ochi dar mai ales în ochii şefului de echipă, el trebuie să afle mai întâi suprafaţa totală a tuturor porţiunilor de zid care mai trebuie zugrăvite.&lt;br /&gt;
Cunoscând lungimea zidului n, numărul de zile m şi porţiunile compacte pe care le zugrăveşte în fiecare zi, determinaţi suprafaţa totală a zidului care mai trebuie zugrăvită.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/probleme/1222/tv TV]===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
#define MAXSEC 60*60*24&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int v[MAXSEC];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin = fopen ( &amp;quot;tv.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  FILE *fout = fopen ( &amp;quot;tv.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  int cer, n, i, d, h, m, s, start;&lt;br /&gt;
&lt;br /&gt;
  fscanf ( fin, &amp;quot;%d%d&amp;quot;, &amp;amp;cer, &amp;amp;n );&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
      fscanf ( fin, &amp;quot;%d %d:%d:%d&amp;quot;, &amp;amp;d, &amp;amp;h, &amp;amp;m, &amp;amp;s );&lt;br /&gt;
      start = h * 60 * 60 + m * 60 + s;&lt;br /&gt;
      v[start] ++;&lt;br /&gt;
      v[start + d] --;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Presupunem ca secunda de aur este 0 ( 00:00:00 )&lt;br /&gt;
  int poz = 0;          // secunda de aur&lt;br /&gt;
  int vmax = v[0];      // nr maxim de posturi care emit publicitate intr-o secunda&lt;br /&gt;
&lt;br /&gt;
  int nr_sec;       // nr sec fara publicitate&lt;br /&gt;
  if ( v[0] == 0 )&lt;br /&gt;
    nr_sec = 1;&lt;br /&gt;
  else&lt;br /&gt;
    nr_sec = 0;&lt;br /&gt;
  for ( i = 1; i &amp;lt; MAXSEC; i++ ) {&lt;br /&gt;
    v[i] += v[i - 1];&lt;br /&gt;
    if ( v[i] == 0 )&lt;br /&gt;
        nr_sec ++;&lt;br /&gt;
    if ( v[i] &amp;gt; vmax ){&lt;br /&gt;
        vmax = v[i];&lt;br /&gt;
        poz = i;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ( cer == 2 )&lt;br /&gt;
    nr_sec = poz;&lt;br /&gt;
  fprintf ( fout, &amp;quot;%02d:%02d:%02d&amp;quot;, nr_sec / 3600, nr_sec % 3600 / 60, nr_sec % 60 );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1062 Flori1]===&lt;br /&gt;
&lt;br /&gt;
===twoop  ===&lt;br /&gt;
Se dă un șir de N elemente, numere întregi. Pe acest șir se aplică operații de două tipuri : &lt;br /&gt;
Tip 1: st dr val – elementele de pe pozițiile din intervalul [st, dr] cresc cu valoarea val&lt;br /&gt;
Tip 2: poz – să se afișeze valoarea elementului de pe poziția poz .&lt;br /&gt;
Dându-se șirul de elemente și operațiile, aplicați operațiile pe șir.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Probleme cu element majoritar == &lt;br /&gt;
* http://varena.ro/problema/proiecte   ( element majoritar )&lt;br /&gt;
&lt;br /&gt;
== Probleme cu two pointers  ==&lt;br /&gt;
===Memory006  ===&lt;br /&gt;
Se dă un şir de numere naturale nenule. Să se afle numărul secvenţelor din şir care au produsul elementelor egal cu 2k, unde k este un număr dat.&lt;br /&gt;
 &lt;br /&gt;
===#1350 produs2 ===&lt;br /&gt;
 &lt;br /&gt;
Se consideră un şir cu elemente numere naturale nenule. Să se afle câte secvenţe din şir au produsul mai mic decât un număr dat.&lt;br /&gt;
&lt;br /&gt;
===#2405 politic===&lt;br /&gt;
  &lt;br /&gt;
În Țara lui Papură Vodă s-au organizat de curând primele alegeri democratice. A rezultat astfel un parlament din care fac parte deputați cu diverse doctrine politice, de stânga sau de dreapta. Acestea sunt descrise prin numere naturale nenule (orientarea politică este cu atât mai de stânga cu cât numărul este mai mic). Parlamentarii s-au asociat în partide politice în funcție de doctrina fiecăruia. Oricare doi deputați ale căror doctrine corespund unor numere consecutive fac parte din același partid. Prin urmare, partidele vor fi alcătuite din deputați ale căror doctrine sunt numere consecutive. (De exemplu, dacă parlamentul are 5 deputați, cu doctrinele 1, 2, 3, 5 şi 6, atunci înseamnă că aceștia sunt grupați în două partide: unul format din 1, 2 și 3 și altul din 5 și 6.)&lt;br /&gt;
Un guvern trebuie să beneficieze de susținerea a mai mult de jumătate dintre parlamentari. De exemplu, dacă parlamentul este format din 7 deputați, atunci un guvern are nevoie de susținerea a cel puțin 4 deputați.&lt;br /&gt;
Pentru a putea guverna, partidele se pot grupa in coaliţii. Regula după care se asociază este urmatoarea: două partide A şi B, A având o doctrină mai de stânga, pot face parte din aceeași coaliţie doar dacă din coaliţia respectivă fac parte toate partidele a căror doctrină este mai de dreapta decât cea a lui A şi mai de stânga decât cea a lui B. De exemplu, dacă parlamentul este alcătuit din deputaţi cu orientările politice 1, 2, 4, 5, 7 şi 8, atunci partidul format din 1 şi 2 nu se poate asocia cu partidul format din 7 şi 8 decât dacă din coaliţia respectivă face parte şi partidul format din 4 şi 5.&lt;br /&gt;
Fiind dat parlamentul din Ţara lui Papură Vodă printr-un şir ordonat strict crescător de numere naturale nenule, se cere să se stabilească numărul de partide parlamentare şi numărul variantelor de coaliţie majoritară.&lt;br /&gt;
ONI Gimnaziu 2007&lt;br /&gt;
&lt;br /&gt;
===#1471 maxdiv === &lt;br /&gt;
Scrieţi un program care afişează, pentru un şir dat format din n numere naturale numărul de secvenţe maxdiv şi cea mai lungă secvenţă maxdiv.&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
Rezolvati problemele de la secvente, ramase nerezolvate, din fisa de laborator&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_25&amp;diff=18025</id>
		<title>Clasa a IX-a lecția 25</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_25&amp;diff=18025"/>
		<updated>2020-12-04T07:26:37Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Utilizarea Ciurului lui Eratostene */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ciurul lui Eratostene ==&lt;br /&gt;
Eratostene a fost un matematician, geograf, poet, astronom și muzician grec. El a trăit între anii 276 și 195 î.Hr. El a inventat cuvîntul &amp;quot;geografie&amp;quot; în greacă, a inventat un sistem de latitudine și longitudine. A fost primul om care a calculat circumferința pămîntului, a calculat înclinația axei de rotație a pămîntului, a creat conceptul de an bisect, și zi bisectă. Tot el a creat prima hartă a lumii, incluzînd paralele și meridiane.&lt;br /&gt;
&lt;br /&gt;
Eratostene a inventat un algoritm foarte eficient de calcul al tuturor numerelor prime pînă la un număr dat. Acest algoritm se studiază la matematică. El procedează astfel: &lt;br /&gt;
&lt;br /&gt;
# &amp;lt;nowiki&amp;gt;Creează o listă a întregilor consecutivi de la 2 la n: [2, 3, 4, ..., n].&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
# Caută primul număr netăiat din listă (inițial nici un număr nu e tăiat). Fie p acel număr.&lt;br /&gt;
# Mergi din p în p prin listă, începînd cu 2*p și taie toate numerele întîlnite (unele vor fi deja tăiate)&lt;br /&gt;
# Reia de la pasul 2, pînă ce depășim n.&lt;br /&gt;
&lt;br /&gt;
În final numerele rămase netăiate sînt prime.&lt;br /&gt;
&lt;br /&gt;
Cum implementăm acest algoritm, care la origine se executa manual, cu hîrtie și creion? Pentru a simula tăierea numerelor vom folosi un vector de frecvență, &amp;lt;tt&amp;gt;ciur&amp;lt;/tt&amp;gt;, care pentru fiecare număr între &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; și &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; ne va spune dacă este tăiat sau nu. Inițial vectorul &amp;lt;tt&amp;gt;ciur&amp;lt;/tt&amp;gt; va fi inițializat cu zero, care semnifică că toate numerele sînt prime, iar pe măsură ce tăiem numere, ele vor fi marcate cu unu. În final &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;ciur[x]&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; va fi zero dacă numărul este prim, sau unu în caz contrar. Deoarece elementele lui &amp;lt;tt&amp;gt;ciur&amp;lt;/tt&amp;gt; sînt zero sau unu nu are rost să folosim întregi pentru ele, ci vom folosi caractere, văzute ca numere mici. Să ne reamintim că un caracter ocupă un octet (opt biți), pe cînd un întreg ocupă 4 octeți (32 de biți). Astfel, memoria folosită va fi de patru ori mai mică. &#039;&#039;(Vom vedea, în viitor, că memoria se poate reduce în continuare dacă ținem doar un bit pe element.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Iată implementarea acestei idei. Programul următor calculează vectorul ciur pentru numerele pînă la &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;, cu &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; maxim două milioane:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;char ciur[2000000];&lt;br /&gt;
...&lt;br /&gt;
fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
for ( d = 2; d &amp;lt; n; d++ )&lt;br /&gt;
  if ( ciur[d] == 0 ) // daca d este prim&lt;br /&gt;
    for ( i = d + d; i &amp;lt;= n; i = i + d ) // vom marca numerele din d in d&lt;br /&gt;
      ciur[i] = 1;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programul se poate optimiza dacă facem următoarele observații:&lt;br /&gt;
&lt;br /&gt;
# În a doua buclă &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt; variabila &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; ia valorile &amp;lt;tt&amp;gt;2∙d, 3∙d, 4∙d, ..., k∙d&amp;lt;/tt&amp;gt;. Pentru &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;k &amp;lt; d&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; toate valorile de forma &amp;lt;tt&amp;gt;k∙d&amp;lt;/tt&amp;gt; au fost deja tăiate de valorile &amp;lt;tt&amp;gt;k&amp;lt;/tt&amp;gt; anterioare, drept pentru care nu are rost să le mai parcurgem. Putem să pornim cu &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; de la &amp;lt;tt&amp;gt;d∙d&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Conform observației anterioare &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; pornește de la &amp;lt;tt&amp;gt;d∙d&amp;lt;/tt&amp;gt;. De aceea nu are rost să mergem cu &amp;lt;tt&amp;gt;d&amp;lt;/tt&amp;gt; mai departe de &amp;lt;tt&amp;gt;sqrt(n)&amp;lt;/tt&amp;gt;, deoarece nu vom mai găsi &amp;lt;tt&amp;gt;i&amp;lt;/tt&amp;gt; astfel încît &amp;lt;tt&amp;gt;i ≤ n&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Iată implementarea optimizată, bazată pe aceste două observații:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;char ciur[2000000];&lt;br /&gt;
...&lt;br /&gt;
fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
for ( d = 2; d * d &amp;lt;= n; d++ )&lt;br /&gt;
  if ( ciur[d] == 0 ) // daca d este prim&lt;br /&gt;
    for ( i = d * d; i &amp;lt;= n; i = i + d ) // vom marca numerele din d in d&lt;br /&gt;
      ciur[i] = 1;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
= Lectie = &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Varianta usor optimizata ===&lt;br /&gt;
Pentru un numar d prim, vom marca toti multiplii acestuia, nepari&lt;br /&gt;
Ex: pentru d = 7, marcam multiplii: 7*7, 7*9, 7*11...sarind peste 7*8, 7*10...&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;char ciur[2000000];&lt;br /&gt;
...&lt;br /&gt;
fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
for ( d = 4; d &amp;lt;= n; d += 2 )&lt;br /&gt;
  ciur[d] = 1;&lt;br /&gt;
for ( d = 3; d * d &amp;lt;= n; d+= 2 )&lt;br /&gt;
  if ( ciur[d] == 0 ) // daca d este prim&lt;br /&gt;
    for ( i = d * d; i &amp;lt;= n; i = i + 2 * d ) // vom marca numerele din 2d in 2d&lt;br /&gt;
      ciur[i] = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putem de asemenea sa optimizam si memoria folosita, pastrand valorile ciurului doar pentru elementele impare.&lt;br /&gt;
 &lt;br /&gt;
ciur[1] va retine daca 3 e prim&lt;br /&gt;
ciur[2] va retine daca 5 e prim&lt;br /&gt;
ciur[3] va retine daca 7 e prim&lt;br /&gt;
ciur[d/2] va retine daca d e prim&lt;br /&gt;
Adica:&lt;br /&gt;
ciur[k] va retine daca 2k + 1 e prim&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
char ciur[2000000];&lt;br /&gt;
for ( d = 3; d * d &amp;lt;= n; d+= 2 )&lt;br /&gt;
  if ( ciur[d/2] == 0 ) // daca d este prim&lt;br /&gt;
    for ( i = d * d; i &amp;lt;= n; i = i + 2 * d ) &lt;br /&gt;
      ciur[i/2] = 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Nu uitați:&lt;br /&gt;
* Vectorul &amp;lt;tt&amp;gt;ciur[]&amp;lt;/tt&amp;gt; este de tip caracter și nu întreg!&lt;br /&gt;
* În final vectorul &amp;lt;tt&amp;gt;ciur[i]&amp;lt;/tt&amp;gt; este &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; dacă numărul este prim sau &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; în caz contrar.&lt;br /&gt;
&lt;br /&gt;
Complexitate? Matematica este complexă, dar rețineți că metoda este aproximativ &#039;&#039;O(n)&#039;&#039; pentru valorile lui n cu care vom lucra noi. Pentru cei interesați, complexitatea este de fapt &#039;&#039;O(n∙log&amp;amp;nbsp;log&amp;amp;nbsp;n)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Utilizarea Ciurului lui Eratostene ==&lt;br /&gt;
===Calcului numarului de divizori ===&lt;br /&gt;
Putem modifica modul de parcurgere al vectorului pentru a calcula numarul de divizori pentru numerele de la 1 la n:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int num_div[2000000];&lt;br /&gt;
...&lt;br /&gt;
fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
for ( d = 1; d &amp;lt;= n; d++ )&lt;br /&gt;
  for ( i = d; i &amp;lt;= n; i = i + d )&lt;br /&gt;
    num_div[i]++;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De asemenea putem calcula similar suma divizorilor pentru numerele de la 1 la n:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int sum_div[2000000];&lt;br /&gt;
...&lt;br /&gt;
fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
for ( d = 1; d &amp;lt;= n; d++ )&lt;br /&gt;
  for ( i = d; i &amp;lt;= n; i = i + d )&lt;br /&gt;
    sum_div[i] = sum_div[i] + d;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Construirea unui vector de numere prime ( Compactarea ciurului ) ==&lt;br /&gt;
Dorim sa contruim un vector de numere prime mai mici sau egale cu o valoare data VMAX. Ne vom folosi deci de ciurul lui Eratostene pentru a determina care numere sunt prime pana la VMAX. Vom ignora numerele pare atunci cand marchez numerele neprime, neaccesand nicioadata aceste pozitii. Vom marca penru un divizor d divizorii acestuia impari: d * d, d*(d+2), sarind peste elementele d*(d+1), d*(d+3) acestea fiind numere pare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#define VMAX 1000000&lt;br /&gt;
char ciur[VMAX+1] = {0}; &lt;br /&gt;
int prime[300000];  // dimensiunea vectorului este data de numarul de numere prime pe care le-as putea gasi pena la VMAX&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  ................. &lt;br /&gt;
  // marcam in ciur numerele impare prime&lt;br /&gt;
  for(int d = 3; d * d &amp;lt;= VMAX; d +=2 )&lt;br /&gt;
    if( ciur[d] == 0 )                                                 &lt;br /&gt;
      for(int i = d * d; i&amp;lt;= VMAX; i = i + 2 * d )   &lt;br /&gt;
        ciur[i] = 1;&lt;br /&gt;
  // punem nr 2 in vectorul de numere prime, fiind singurul nr par prim&lt;br /&gt;
  prime[0] = 2; &lt;br /&gt;
  // parcurgem ciurul doar pe pozitiile impare si construim vectorul de numere prime&lt;br /&gt;
  k = 1;&lt;br /&gt;
  for( d = 3; d &amp;lt;= VMAX; d += 2 )&lt;br /&gt;
    if( ciur[d] == 0 ) &lt;br /&gt;
       prime[k++] = d;&lt;br /&gt;
...................&lt;br /&gt;
} &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#define VMAX 1000000&lt;br /&gt;
&lt;br /&gt;
char ciur[VMAX] = {0}; &lt;br /&gt;
int prime[300000];         &lt;br /&gt;
&lt;br /&gt;
  v[0] = 2; k = 1;&lt;br /&gt;
  for(d = 3; d &amp;lt;= 1000000; d +=2 )&lt;br /&gt;
    if( ciur[d] == 0 ){                                       // daca d e prim&lt;br /&gt;
      prime[k++] = d;                                         // pun val d in vectorul v&lt;br /&gt;
      for(long long i = 1LL * d * d; i&amp;lt;= 1000000; i=i+2*d )   // marchez ca neprime&lt;br /&gt;
        ciur[i] = 1;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
https://infoarena.ro/problema/divprim&lt;br /&gt;
&lt;br /&gt;
= Temă  =&lt;br /&gt;
== Tema Teorie == &lt;br /&gt;
Tema 23 de pe pbinfo&lt;br /&gt;
&lt;br /&gt;
== Tema Laborator == &lt;br /&gt;
Rezolvati problemele din runda de pe varena:&lt;br /&gt;
* [http://varena.ro/runda/c2_9 Tema 24] &lt;br /&gt;
** [http://varena.ro/problema/apropiate apropiate]&lt;br /&gt;
** [http://varena.ro/problema/apropiate1 apropiate1]&lt;br /&gt;
** [http://varena.ro/problema/extraprime extraprime]&lt;br /&gt;
** [http://varena.ro/problema/prime prime]&lt;br /&gt;
** [http://varena.ro/problema/kdiv kdiv]&lt;br /&gt;
&lt;br /&gt;
=== Ciur ===&lt;br /&gt;
* [http://varena.ro/problema/prime prime], Ioana Bica [http://isa.algopedia.ro/wiki/index.php/prime Rez]&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=1176 bileprime] campion 2010, (inca nu e pusa pe varena) [http://isa.algopedia.ro/wiki/index.php/bileprime Rez]&lt;br /&gt;
* [http://varena.ro/problema/paisprezece paisprezece] [http://isa.algopedia.ro/wiki/index.php/paisprezece Rez]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=detalii-evaluare&amp;amp;id=7712114 extraprime]&lt;br /&gt;
=== Ciur, Compactare Ciur ===&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=365 prime], campion2005 (inca nu e pusa pe varena)&lt;br /&gt;
* [http://varena.ro/problema/sprime sprime], XOR 2015 clasa a 9 a&lt;br /&gt;
&lt;br /&gt;
=== Ciur modificat === &lt;br /&gt;
* [http://varena.ro/problema/kdiv kdiv] aplicație a ciurului lui Eratostene - folosim ciurul pentru a memora pentru fiecare numar cati divizori primi are fiecare numar&lt;br /&gt;
* [http://varena.ro/problema/intervale intervale] aplicație a ciurului lui Eratostene - folosim ciurul pentru a memora pentru fiecare numar cati divizori primi are fiecare numar + sume partiale&lt;br /&gt;
* Prime1 - pbinfo oni 2017 clasa a v-a ca aplicație a ciurului lui Eratostene; folosim ciurul pentru a marca ce numere sunt si prime si in sirul lui fibbonacci&lt;br /&gt;
&lt;br /&gt;
Optional&lt;br /&gt;
* [http://varena.ro/problema/prim prim] dată la ONI 2003 clasa a 5&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;br /&gt;
* [http://varena.ro/problema/cub1 cub1] dată la ONI 2002 clasa a 5&amp;lt;sup&amp;gt;a&amp;lt;/sup&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia22&amp;diff=18022</id>
		<title>10 2018 Lectia22</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia22&amp;diff=18022"/>
		<updated>2020-11-26T16:19:40Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Metoda Divide et impera = &lt;br /&gt;
&#039;&#039;&#039;Achizitii anterioare&#039;&#039;&#039; &lt;br /&gt;
Pentru a parcurge aceasta lectie trebuie sa stiti:&lt;br /&gt;
* Tablouri unidimensionale ( vectori )&lt;br /&gt;
* Subprograme definite de utilizator&lt;br /&gt;
* Recursivitate. Principiul recursivitatii ( ce se intampla la un nivel, se intampla la orice nivel, avand grija sa asiguram oprirea lantului recursiv)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Utilizare&#039;&#039;&#039; &lt;br /&gt;
* Cautare binara - analogie cu cautarea unui cuvant intr-un dictionar&lt;br /&gt;
* Sortari rapide (QuickSort,MergeSort, Stitistici de ordine) -analogie cu impartirea merelor in 2 gramezi in functie de un mar etalon &lt;br /&gt;
* Un alt domeniu de utilizare a tehnicii divide et impera este programarea paralelă pe mai multe procesoare, sub-problemele fiind executate pe mașini diferite.&lt;br /&gt;
&lt;br /&gt;
== Introducere ==&lt;br /&gt;
Expresia “Divide et Impera” provine din limba latina si reprezinta unul dintre principiile de guvernare ale imparatului roman Iulius Caesar. In traducere inseamna „dezbina si stapaneste”. El a ajuns la concluzia ca o masa de oameni poate fi mai usor stapanita, atunci cand este dezbinata!&lt;br /&gt;
In informatica metoda Divide et Impera reprezinta o metoda de programare ce se bazeaza pe acelasi principiu. Aceasta presupune 3 etape de rezolvare:&lt;br /&gt;
#  &#039;&#039;&#039;DIVIDE&#039;&#039;&#039; problema data se descompune in 2 sau mai multe subprobleme, de acelasi tip cu problema initiala, dar de dimensiuni mai mici, independente ( subproblemele nu se suprapun ).&lt;br /&gt;
#  &#039;&#039;&#039;STAPANESTE&#039;&#039;&#039; Se rezolvata subproblemele. Subproblemele se rezolva direct daca dimensiunea lor permite acest lucru (probleme elementare) sau, fiind de acelasi tip, se rezolva in mod recursiv, in acelasi mod precum problema initiala (se descompun in continuare similar cu problema de baza. Procesul de descompunere continua pana cand s-au obtinut numai probleme elementare). &lt;br /&gt;
#  &#039;&#039;&#039;COMBINA&#039;&#039;&#039; Se combina solutiile subproblemelor pentru a obtine solutia problemelor initiale.&lt;br /&gt;
&lt;br /&gt;
==Modelul metodei==&lt;br /&gt;
Cel mai potrivit model pentru explicarea metodei il constituie prelucrarea unui vector (sir) de forma fara: (x0,x1,…,xn-1). Aplicarea metodei consta in impartirea sirului dat in doua subsiruri (x0,…xm), (xm+1,…,xn-1) si prelucrarea fiecaruia dintre ele. Astfel, am descompus problema in doua subprobleme de acelasi tip. In continuare, pentru fiecare dintre subsirurile obtinute sunt posibile doua situatii:&lt;br /&gt;
* Se poate prelucra direct;&lt;br /&gt;
* Nu poate fi prelucrat direct, caz in care subsirul trebuie descompus in acelasi fel. Lantul de descompuneri va continua pana cand obtinem numai subsiruri prelucrabile direct. Putin mai general, putem modela procedeul considerand ca la fiecare pas al algoritmului va fi analizat un subsir de forma (xp,…xq), care contine elementele sirului situate intre indicii p si q. Presupunem ca oricare ar fi p,q∈{0,1,…n-1}, exista m∈{p,…,q} asa incat prelucrarea subsirului {xp,…,xq} sa se faca prelucrand subsirurile (xp,…,xm) si (xm+1,…,xq). Este natural sa consideram ca prelucrarea subsirului (xp,…xq) se face printr-o functie recursiva, notata generic Div_Imp (int p, int q). O structura posibila a acesteia ar fi:&lt;br /&gt;
* Daca subsirul (xp,…xq) poate fi prelucrat direct, atunci il prelucram;&lt;br /&gt;
In caz contrar:&lt;br /&gt;
* Impartim subsirul (xp,…xq) in alte 2 subsiruri: (xp,…xm) si (xm+1,…xq)&lt;br /&gt;
* Prelucram subsirurile obtinute: intrucat subsirul(xp,…xm) trebuie descompus mai departe in aceeasi maniera, rezulta ca prelucrarea acestuia se va face printr-un auto-apel recursiv de forma Div_Imp (p,m); analog, sirul (xm+1,…xq) se va prelucra prin auto-apelul Div_Imp (m+1,q)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Observatii:&#039;&#039;&#039;&lt;br /&gt;
* De obicei elementul xm care determina partitionarea subsirului (xp,…xq), este cel aflat pe pozitia de mijloc: m=(p+q)/2(“parte intreaga din (p+q)/2”).&lt;br /&gt;
Astfel, subsirurile obtinute vor avea dimensiuni apropiate si in consecinta subproblemele determinate de catre aceste subsiruri vor fi apropiate din punct de vedere al complexitatii.&lt;br /&gt;
* In procesul de descompunere, subsirurile pot fi alese si altfel: de exemplu, (xp,…xm-1) si (xm+1,…xq), adica elementul de referinta xm nu a fost inclus in nici unul dintre subsiruri;&lt;br /&gt;
* In general, un subsir poate fi prelucrat direct daca nu are nici un element sau contine un singur element.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Complexitatea&#039;&#039;&#039; algoritmului este dată de formula: &lt;br /&gt;
unde D(n), S(n) şi C(n) reprezintă complexitățile celor 3 pași descriși mai sus: divide, stăpânește, respectiv combină&lt;br /&gt;
 T(n) = D(n)+S(n)+C(n), unde D(n)=O(1), S(n)=2∗T(n/2) și C(n)=O(n), rezulta &lt;br /&gt;
 T(n) = 2∗T(n/2)+O(n).&lt;br /&gt;
Vom ajunge la complexitatea:&lt;br /&gt;
 T(n) = O(n∗log(n)) &lt;br /&gt;
 &lt;br /&gt;
=== Maximul dintr-un vector ===&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/1019/maxim6 maxim6]&lt;br /&gt;
&#039;&#039;&#039;Enunt:&#039;&#039;&#039; Se consideră un șir cu &#039;&#039;&#039;n&#039;&#039;&#039; elemente, numere naturale. Folosind metoda Divide et Impera, determinați cel mai mare element din acest șir.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Descrierea solutiei&#039;&#039;&#039;: Impartim problema in 2 subprobleme de complexitate similara. Vom mparti intervalul de cautare in 2 subintervale, rezultand astfel 2 subprobleme, similare problemei intiale, dar de complexitate mai mica. Vom continua impartirea acestora in alte subintervale pana vor rezulta intervale cu un singur elemenent. Aceste probleme elementare le putem rezolva direct, intrerupand lantul recursiv. Putem defini deci functia vmax astfel:&lt;br /&gt;
&lt;br /&gt;
 vmax(i, j) = v[i], daca i = j&lt;br /&gt;
            = max(vmax(i,m), vmax(m+1, j)), daca i&amp;lt;j&lt;br /&gt;
             &lt;br /&gt;
* dacă i = j, valoarea maxima va fi v[i]; &lt;br /&gt;
* în caz contrar, se imparte vectorul în doi subvectori . Se calculează mijlocul m al intervalului [i, j]: m = (i+j) / 2. Primul subvector va conține componentele de la i la m, al doilea va conține componentele de la (m+1) la j; se rezolvă subproblemele (aflându-se astfel maximul pentru fiecare din subvectori), iar soluția curentă va fi dată de valoarea maximă dintre rezultatele celor două subprobleme. &lt;br /&gt;
&#039;&#039;&#039;Implementare&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int v[1000], n;&lt;br /&gt;
&lt;br /&gt;
int max( int i, int j ) {&lt;br /&gt;
  int a, b, m;&lt;br /&gt;
  if ( i == j )&lt;br /&gt;
    return v[i];&lt;br /&gt;
&lt;br /&gt;
  m = ( i + j ) / 2;&lt;br /&gt;
  a = max( i, m );&lt;br /&gt;
  b = max( m + 1, j );&lt;br /&gt;
  if  ( a &amp;gt; b )&lt;br /&gt;
    return a;&lt;br /&gt;
  else&lt;br /&gt;
    return b;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main( ) {&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for (int i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
  cout &amp;lt;&amp;lt; max( 0, n - 1 );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Cmmdc===&lt;br /&gt;
[https://www.pbinfo.ro/probleme/1023/cmmdc3 cmmdc3]&lt;br /&gt;
Enunt:Se dă un sir cu n elemente, numere naturale nenule. Folosind metoda Divide et Impera, determinaţi cel mai mare divizor comun al elementelor acestui șir.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int cmmdc( int a, int b ){&lt;br /&gt;
  int r;&lt;br /&gt;
  while( b &amp;gt; 0 ){&lt;br /&gt;
    r = a % b;&lt;br /&gt;
    a = b;&lt;br /&gt;
    b = r;&lt;br /&gt;
  }&lt;br /&gt;
  return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int n,v[1001];&lt;br /&gt;
&lt;br /&gt;
int f( int st, int dr ){&lt;br /&gt;
  if( st == dr )&lt;br /&gt;
    return v[st];&lt;br /&gt;
  int mij = ( st + dr ) / 2;&lt;br /&gt;
  int s1 = f( st, mij );&lt;br /&gt;
  int s2 = f( mij + 1, dr );&lt;br /&gt;
  return cmmdc( s1, s2 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for(int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
  cout &amp;lt;&amp;lt; f( 1, n );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Suma elementelor pare dintr-o matrice ===&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/3165/matrdivimp1 matrdivimp1]&lt;br /&gt;
Se consideră o matrice cu m linii și n coloane, numere naturale. Folosind metoda Divide et Impera, determinați suma numerelor pare din matrice. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int a[101][101], m, n;&lt;br /&gt;
long long sum( int i1, int j1, int i2, int j2 ){&lt;br /&gt;
    // problema elementara - matrice fara nici un element&lt;br /&gt;
    if ( i2 &amp;lt; i1 || j2 &amp;lt; j1 )&lt;br /&gt;
      return 0;&lt;br /&gt;
    // problema elementara - matrice cu un singur element&lt;br /&gt;
    if ( i1 == i2 &amp;amp;&amp;amp; j1 == j2 )&lt;br /&gt;
      if ( a[i1][j1] % 2 == 0 )&lt;br /&gt;
        return a[i1][j1];&lt;br /&gt;
      else&lt;br /&gt;
        return 0;&lt;br /&gt;
    long long s = 0;&lt;br /&gt;
    // problema neelementara - impart matricea in 4 submatrici&lt;br /&gt;
    int imij = ( i1 + i2 ) / 2;&lt;br /&gt;
    int jmij = ( j1 + j2 ) / 2;&lt;br /&gt;
    int s1 = sum( i1, j1, imij, jmij );     // rezolv subproblemele&lt;br /&gt;
    int s2 = sum( i1, jmij + 1, imij, j2 );&lt;br /&gt;
    int s3 = sum( imij + 1, j1, i2, jmij );&lt;br /&gt;
    int s4 = sum(imij + 1, jmij + 1, i2, j2 );&lt;br /&gt;
    return s1 + s2 + s3 + s4;           // combin rezultatul subproblemelor pentru a obtine sol problemei initiale&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;&lt;br /&gt;
  for ( int i = 0; i&amp;lt; n; i++ )&lt;br /&gt;
    for ( int j = 0; j &amp;lt; m; j++ )&lt;br /&gt;
      cin &amp;gt;&amp;gt; a[i][j];&lt;br /&gt;
  cout&amp;lt;&amp;lt;sum( 0, 0, n - 1, m - 1);&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia21&amp;diff=18020</id>
		<title>10 2018 Lectia21</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia21&amp;diff=18020"/>
		<updated>2020-10-30T21:23:13Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Aplicații */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Temă  Rezolvări =&lt;br /&gt;
Rezolvări aici [http://solpedia.francu.com/wiki/index.php/Clasa_a_VII-a_lec%C8%9Bia_4_-_8_oct_2015]&lt;br /&gt;
&lt;br /&gt;
= Temă =&lt;br /&gt;
&lt;br /&gt;
Rezolvări aici [http://solpedia.francu.com/wiki/index.php/Clasa_VII/VIII_lec%C8%9Bia_6_-_28_oct_2014]&lt;br /&gt;
&lt;br /&gt;
= Lecție =&lt;br /&gt;
== Recursivitate - FILL ==&lt;br /&gt;
=== Fill recursiv (flood fill) ===&lt;br /&gt;
==== Introducere ====&lt;br /&gt;
Algoritmul &#039;&#039;fill&#039;&#039; &amp;quot;umple&amp;quot; toate golurile accesibile de la un punct dat. Golurile pot fi elemente diferite de 0 intr-o matrice, de exemplu, iar vecinii pot fi definiți ca elementele adiacente pe linie și coloană (acesta este cazul cel mai întîlnit). Alteori vecinii pot fi definiți ca avînd un punct comun cu elementul curent, ceea ce include și elementele alăturate pe diagonală. Să luăm un exemplu clasic:&lt;br /&gt;
&lt;br /&gt;
Se dă o matrice &amp;lt;tt&amp;gt;a[m][n]&amp;lt;/tt&amp;gt; cu elemente &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; și &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; semnificînd zid și &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; semnificînd liber, precum și o poziție în matrice, &amp;lt;tt&amp;gt;(l, c)&amp;lt;/tt&amp;gt;. Să se spuna cîte elemente &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; sînt accesibile de la &amp;lt;tt&amp;gt;(l, c)&amp;lt;/tt&amp;gt; avansînd doar pe linie sau pe coloană.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;int suma;&lt;br /&gt;
...&lt;br /&gt;
void fill( int l, int c ) {&lt;br /&gt;
  suma++;&lt;br /&gt;
  a[l][c] = 0;&lt;br /&gt;
  if ( l &amp;gt; 0 &amp;amp;&amp;amp; a[l-1][c] == 1 )&lt;br /&gt;
    fill( l - 1, c );&lt;br /&gt;
  if ( l &amp;lt; m-1 &amp;amp;&amp;amp; a[l+1][c] == 1  )&lt;br /&gt;
    fill( l + 1, c );&lt;br /&gt;
  if ( c &amp;gt; 0 &amp;amp;&amp;amp; a[l][c-1] == 1 )&lt;br /&gt;
    fill( l, c - 1 );&lt;br /&gt;
  if ( c &amp;lt; n-1 &amp;amp;&amp;amp; a[l][c+1] == 1  )&lt;br /&gt;
    fill( l, c + 1 );&lt;br /&gt;
}&lt;br /&gt;
...&lt;br /&gt;
int main() {&lt;br /&gt;
  ...&lt;br /&gt;
  suma = 0;&lt;br /&gt;
  if ( a[l][c] == 1 )&lt;br /&gt;
    fill( l, c );&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, suma );&lt;br /&gt;
  ...&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acest algoritm are complexitate O(m×n) ca timp, deoarece poate parcurge toate elementele matricei, iar prelucrarea per element este O(1). Memoria ocupată este de asemenea O(m×n) deoarece fiecare apel recursiv necesită O(1) memorie și putem avea O(m×n) apeluri recursive unul în altul.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Atenție&#039;&#039;&#039;! Acesta este principalul impediment al metodei! Ea folosește foarte multă memorie suplimentară.&lt;br /&gt;
&lt;br /&gt;
=== Optimizări ===&lt;br /&gt;
==== Bordare matrice ====&lt;br /&gt;
O primă optimizare de timp este clasică. Pentru a face programul atît mai rapid cît și mai scurt putem borda matricea de jur împrejur cu elementul zid, în cazul nostru &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;. Astfel vom scuti testul de ieșire a coordonatelor din matrice. Funcția se simplifică:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;void fill( int l, int c ) {&lt;br /&gt;
  suma++;&lt;br /&gt;
  a[l][c] = 0;&lt;br /&gt;
  if ( a[l-1][c] == 1 )&lt;br /&gt;
    fill( l - 1, c );&lt;br /&gt;
  if ( a[l+1][c] == 1  )&lt;br /&gt;
    fill( l + 1, c );&lt;br /&gt;
  if ( a[l][c-1] == 1  )&lt;br /&gt;
    fill( l, c - 1 );&lt;br /&gt;
  if ( a[l][c+1] == 1  )&lt;br /&gt;
    fill( l, c + 1 );&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Vectori de directie ====&lt;br /&gt;
In algoritmul de mai sus avem in functia de fill cate un if pentru fiecare vecin al elementului de coordonate (l,c). Putem defini coordonatele vecinilor folosind vectori de directie,, parcurgerea tuturor vecinilor realizandu-se mult mai usor, mai ales in cazul in care pentru un element dat avem mai multi vecini, de pilda cand elementele adiacente pe diagonala sunt considerate si acestea vecini cu un element dat, astfel un element al matricei va avea 8 vecini.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int dl[4] = { -1, 0, 1, 0, -1, 1,  1, -1};  //N, E, S, V, NE, SE, SV, NV&lt;br /&gt;
int dc[4] = {  0, 1, 0,-1,  1, 1, -1, -1};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void fill( int l, int c ){&lt;br /&gt;
  suma++;&lt;br /&gt;
  a[l][c] = 0;                        // marcam ca vizitata casuta&lt;br /&gt;
  for ( int i = 0; i &amp;lt; 4; i++){       // parcurgem toti vecinii si apelam fill pentru vecinii egali cu 1&lt;br /&gt;
    int x, y;&lt;br /&gt;
    x = l + dl[i];&lt;br /&gt;
    y = c + dc[i];&lt;br /&gt;
    if ( a[x][y] == 1 )&lt;br /&gt;
      fill ( x, y );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Aplicatie- Problema Fill ( pbinfo ) cu vectori de directie si bordare matrice =====&lt;br /&gt;
Se cere numarul de suprafete pline cu 1&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int a[102][102], m,n;&lt;br /&gt;
int dl[4] = { -1, 0, 1, 0 };&lt;br /&gt;
int dc[4] = {  0, 1, 0,-1 };&lt;br /&gt;
ifstream fin ( &amp;quot;fill.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;fill.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
void fill( int l, int c ){&lt;br /&gt;
  a[l][c] = 0;                        // marcam ca vizitata casuta&lt;br /&gt;
  for ( int i = 0; i &amp;lt; 4; i++){       // parcurgem toti vecinii si apelam fill pentru vecinii egali cu 1&lt;br /&gt;
    int x, y;&lt;br /&gt;
    x = l + dl[i];&lt;br /&gt;
    y = c + dc[i];&lt;br /&gt;
    if ( a[x][y] == 1 )&lt;br /&gt;
      fill ( x, y );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (){&lt;br /&gt;
  int i, j;&lt;br /&gt;
  // citire matrice&lt;br /&gt;
  fin &amp;gt;&amp;gt; m &amp;gt;&amp;gt; n;&lt;br /&gt;
  for (  i = 1; i &amp;lt;= m; i ++ )&lt;br /&gt;
    for ( j = 1; j &amp;lt;= n; j ++ )&lt;br /&gt;
       fin &amp;gt;&amp;gt; a[i][j];&lt;br /&gt;
  // Bordare matrice : este bordata cu 0, fiind declarata global&lt;br /&gt;
  &lt;br /&gt;
  // Pentru fiecare element ramas nenul, al matricei, apelez functia de umlmere&lt;br /&gt;
  int cnt = 0;                      // numarul de continente&lt;br /&gt;
  for ( i = 1; i &amp;lt;= m; i ++ )&lt;br /&gt;
    for ( j = 1; j &amp;lt;= n; j ++ )&lt;br /&gt;
      if( a[i][j] ){&lt;br /&gt;
        fill( i, j );&lt;br /&gt;
        cnt ++;&lt;br /&gt;
      }&lt;br /&gt;
  fout &amp;lt;&amp;lt; cnt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Reducerea memoriei folosite ====&lt;br /&gt;
Cum calculăm memoria ocupată? Țineți minte: fiecare apel recursiv ocupă memorie echivalentul unui &amp;lt;tt&amp;gt;int&amp;lt;/tt&amp;gt;. Pe un calculator de 32 de biți, cum sint cele pe care lucrăm noi, aceasta înseamnă patru octeți. Aceasta este adresa de întoarcere din funcție. Alte elemente care ocupă memorie pe stivă sînt parametrii transmiși și variabilele declarate în funcție. În cazul nostru vom avea 8 octeți cei doi parametri.&lt;br /&gt;
&lt;br /&gt;
Dacă micșorarea memoriei folosite este esențială putem elimina acești parametri, făcînd variabilele &amp;lt;tt&amp;gt;l&amp;lt;/tt&amp;gt; și &amp;lt;tt&amp;gt;c&amp;lt;/tt&amp;gt; globale, astfel:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int dl[4] = { -1, 0, 1, 0, -1, 1,  1, -1};  //N, E, S, V, NE, SE, SV, NV&lt;br /&gt;
int dc[4] = {  0, 1, 0,-1,  1, 1, -1, -1};&lt;br /&gt;
int l, c;&lt;br /&gt;
int suma;&lt;br /&gt;
void fill() {&lt;br /&gt;
  suma++;&lt;br /&gt;
  a[l][c] = 0;                        // marcam ca vizitata casuta&lt;br /&gt;
  for ( int i = 0; i &amp;lt; 4; i++){       // parcurgem toti vecinii si apelam fill pentru vecinii egali cu 1&lt;br /&gt;
    l = l + dl[i];&lt;br /&gt;
    c = c + dc[i];&lt;br /&gt;
    if ( a[l][c] == 1 )&lt;br /&gt;
      fill ( l, c );&lt;br /&gt;
    l = l - dl[i];&lt;br /&gt;
    c = c - dc[i];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Chiar și în această formă algoritmul va folosi 4 octeți pe apel recursiv imbricat pentru adresa de revenire din funcție.&lt;br /&gt;
&lt;br /&gt;
===== Aplicatie- Problema Fill ( pbinfo ) cu bordare, vectori de directie si optimizare de memorie =====&lt;br /&gt;
Se cere numarul de suprafete pline cu 1&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int a[102][102], m,n;&lt;br /&gt;
int dl[4] = { -1, 0, 1, 0 };&lt;br /&gt;
int dc[4] = {  0, 1, 0,-1 };&lt;br /&gt;
ifstream fin ( &amp;quot;fill.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;fill.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
void fill() {&lt;br /&gt;
  a[l][c] = 0;                               // marcam ca vizitata casuta&lt;br /&gt;
  for ( int i = 0; i &amp;lt; 4; i++)               // parcurgem toti vecinii si apelam fill pentru vecinii egali cu 1&lt;br /&gt;
    if ( a[l + dl[i]][c + dc[i]] == 1 ){     // verificam daca vecinul este egal cu 1&lt;br /&gt;
      l = l + dl[i];                         // mutam coordonatele pe coordonatele vecinului&lt;br /&gt;
      c = c + dc[i];&lt;br /&gt;
      fill ( );                              // reapelam functia de pe coordonatele vecinului&lt;br /&gt;
      l = l - dl[i];                         // readucem coordonatele pe elementul curent&lt;br /&gt;
      c = c - dc[i];&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (){&lt;br /&gt;
  int i, j;&lt;br /&gt;
  // citire matrice&lt;br /&gt;
  fin &amp;gt;&amp;gt; m &amp;gt;&amp;gt; n;&lt;br /&gt;
  for (  i = 1; i &amp;lt;= m; i ++ )&lt;br /&gt;
    for ( j = 1; j &amp;lt;= n; j ++ )&lt;br /&gt;
       fin &amp;gt;&amp;gt; a[i][j];&lt;br /&gt;
  // Bordare matrice : este bordata cu 0, fiind declarata global&lt;br /&gt;
  &lt;br /&gt;
  // Pentru fiecare element ramas nenul, al matricei, apelez functia de umlmere&lt;br /&gt;
  int cnt = 0;                      // numarul de continente&lt;br /&gt;
  for ( i = 1; i &amp;lt;= m; i ++ )&lt;br /&gt;
    for ( j = 1; j &amp;lt;= n; j ++ )&lt;br /&gt;
      if( a[i][j] ){&lt;br /&gt;
        fill( i, j );&lt;br /&gt;
        cnt ++;&lt;br /&gt;
      }&lt;br /&gt;
  fout &amp;lt;&amp;lt; cnt;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Aplicații ==&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1864 MosCraciun]	====&lt;br /&gt;
Moș Crăciun locuiește la polul nord și pregătește cadouri pentru copii cuminți din clasa a X-a A, ajutat de mai mulți spiriduși. Datorită încălzirii globale, gheața se topește, formându-se mai multe banchize. Spiridușii care se află pe alte banchize decât Moș Crăciun nu-l mai pot ajuta pe acesta, spre disperarea generală.&lt;br /&gt;
&lt;br /&gt;
Scrieți un program care să determine câți spiriduși se află pe aceeași banchiză cu Moș Crăciun și îl pot ajuta în continuare să pregătească cadouri pentru copii cuminți din clasa a X-a A.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int a[102][102], m,n;&lt;br /&gt;
int dl[4] = { -1, 0, 1, 0 };&lt;br /&gt;
int dc[4] = {  0, 1, 0,-1 };&lt;br /&gt;
int spiridusi, s;&lt;br /&gt;
&lt;br /&gt;
ifstream fin ( &amp;quot;moscraciun.in&amp;quot; );&lt;br /&gt;
ofstream fout ( &amp;quot;moscraciun.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
void fill( int l, int c ){&lt;br /&gt;
  int i, x, y;&lt;br /&gt;
  if ( a[l][c] == 3 )&lt;br /&gt;
    spiridusi ++;&lt;br /&gt;
  a[l][c] = 0;                        // marcam ca vizitata casuta&lt;br /&gt;
  for ( i = 0; i &amp;lt; 4; i++){       // parcurgem toti vecinii si apelam fill pentru vecinii egali cu 1&lt;br /&gt;
    x = l + dl[i];&lt;br /&gt;
    y = c + dc[i];&lt;br /&gt;
    if ( a[x][y] )&lt;br /&gt;
      fill ( x, y );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main (){&lt;br /&gt;
  int i, j;&lt;br /&gt;
&lt;br /&gt;
  // citire matrice&lt;br /&gt;
  fin &amp;gt;&amp;gt; m &amp;gt;&amp;gt; n;&lt;br /&gt;
  for (  i = 1; i &amp;lt;= m; i ++ )&lt;br /&gt;
    for ( j = 1; j &amp;lt;= n; j ++ )&lt;br /&gt;
       fin &amp;gt;&amp;gt; a[i][j];&lt;br /&gt;
&lt;br /&gt;
  // Bordare matrice : este bordata cu 0, fiind declarata global&lt;br /&gt;
&lt;br /&gt;
  // Pentru fiecare element ramas nenul, al matricei, apelez functia de umplmere&lt;br /&gt;
  for ( i = 1; i &amp;lt;= m; i ++ )&lt;br /&gt;
    for ( j = 1; j &amp;lt;= n; j ++ )&lt;br /&gt;
      if( a[i][j] == 2 ){        &lt;br /&gt;
        spiridusi  = 0;    // numaram spiridusii de pe insula curenta&lt;br /&gt;
        fill( i, j );&lt;br /&gt;
        s += spiridusi;  // adunam la s nr de spiridusi de pe insula&lt;br /&gt;
      }&lt;br /&gt;
&lt;br /&gt;
  fout &amp;lt;&amp;lt; s;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2385 oaste] ====	&lt;br /&gt;
Pe un continent reprezentat printr-o matrice cu n linii si m coloane se aflá mai multe state, toate aflate in conflict. Astfel, fiecare si-a mobilizat oastea. Elementele matrici memoreazá cäte o cifrá. Doua elemente ínvecinate pe linie sau pe coloaná (nu si pe diagonalá) apartin aceluiasi stat si se numesc regiuni. O pozitie din matrice ce contine cifra 0 este o regiune neutra si nu are soldati, iar pozitia ce contine o cifra c nenula apartine unui stat si are c soldati. Determinati regiunea cu cei mai multi soldati din statul cu cei mai multi soldati.&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2741 SAO1] ====	&lt;br /&gt;
După ce ți-ai dat seama că nu poți învinge nici unul dintre monștrii (din problema SAO), ai decis să te retragi și să devii un fermier. Din banii pentru cumpărarea echipamentului ai cumpărat o parcelă codificată sub forma unei matrice de n linii și m coloane, pentru fiecare zonă cunoscându-se fertilitatea ei. Cum nu ai bani ca să cultivi pământul, dorești să selectezi o parcelă în care toate zonele să aibă aceeași fertilitate, iar fertilitatea totală să fie maximă. Fertilitatea totală a unei parcele este egală cu suma fertilităților zonelor care compun acea parcelă.&lt;br /&gt;
&lt;br /&gt;
Dându-se matricea codificărilor zonelor din teren, să se determine fertilitatea totală maximă a unei parcele în care toate zonele au aceeași fertilitate.&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=838 Iesire] ====	&lt;br /&gt;
Se dă planul unei clădiri pătrate formate din n*n camere, sub forma unei matrice cu n linii și n coloane și elemente 0 sau 1. Camerele marcate cu 0 sunt libere, cel marcate cu 1 sunt inaccesibile și fiecare cameră are o pereche de coordonate, de forma I J, reprezentând linia și coloană pe care este situată camera. Dintr-o cameră liberă se poate trece în altă cameră liberă, cu condiția să se învecineze pe linie sau pe coloană.&lt;br /&gt;
&lt;br /&gt;
Administratorul clădirii primește o listă cu coordonatele a m camere pentru care s-au găsit potențiali chiriași. Nu pot fi închiriate decât camerele libere și accesibile din exteriorul clădirii – adică să existe o succesiune de camere învecinate care începe pe o latură a clădirii și se încheie la camera respectivă.&lt;br /&gt;
&lt;br /&gt;
Pentru fiecare dintre camerele din listă, verificați dacă poate fi închiriată sau nu.&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=840 Croco]====	&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente 0 sau 1, care reprezintă harta unui lac, în care 1 înseamnă uscat, iar 0 înseamnă apă.&lt;br /&gt;
&lt;br /&gt;
Să se plaseze pe fiecare zonă cu uscat un crocodil sau un elefant astfel încât să nu fie două animale din aceeași specie în zone învecinate.&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1369 Parcela]====	&lt;br /&gt;
Se dau n și m reprezentând dimensiunile unui tablou bidimensional format din elementele 0 si 1. Se definește o parcelă ca fiind o grupare de elemente vecine cu valoarea 1. Să se determine numărul de parcele nr, aria maximă a unei parcele amax și respectiv numărul parcelei cu arie maximă&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1576 zona3]====	&lt;br /&gt;
Se consideră o matrice cu n linii și m coloane. Spunem că o poziție este liberă dacă elementul de pe linia i și coloana j este egal cu 0 și 1 în caz contrar. Spunem despre mai multe elemente ocupate că formează o zonă, daca elementele se învecinează pe cele patru direcții (sus, jos, dreapta, stânga).&lt;br /&gt;
&lt;br /&gt;
Calculați pentru fiecare zonă numărul de elemente și afișați noua matricea formată prin înlocuirea elementelor egale cu 1 cu numărul de elemente pe care îl are zona din care face parte elementul respectiv.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Se considera o harta pătratică în care insulele sunt simbolizate cu 1 si apele cu 0. Colorați diferit fiecare insulă din această hartă (prima insulă va fi marcată cu 2, a doua cu 3, etc...). Afișați numărul de insule găsite.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;assert.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_N 100&lt;br /&gt;
#define MAX_M 100&lt;br /&gt;
&lt;br /&gt;
int mat[1 + MAX_N + 1][1 + MAX_M + 1];&lt;br /&gt;
&lt;br /&gt;
void fill(int l, int c, int vechi, int nou) {&lt;br /&gt;
	assert(mat[l][c] == vechi);&lt;br /&gt;
	// sunt sigur ca celula curenta are valoarea 1&lt;br /&gt;
	mat[l][c] = nou;&lt;br /&gt;
	if (mat[l+1][c] == vechi) // jos&lt;br /&gt;
		fill(l+1, c, vechi, nou);&lt;br /&gt;
	if (mat[l][c+1] == vechi) // dreapta&lt;br /&gt;
		fill(l, c+1, vechi, nou);&lt;br /&gt;
	if (mat[l-1][c] == vechi) // sus&lt;br /&gt;
		fill(l-1, c, vechi, nou);&lt;br /&gt;
	if (mat[l][c-1] == vechi) // stanga&lt;br /&gt;
		fill(l, c-1, vechi, nou);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
	int N, M;&lt;br /&gt;
	int i, j;&lt;br /&gt;
&lt;br /&gt;
	// citirea datelor&lt;br /&gt;
	scanf(&amp;quot;%d&amp;quot;, &amp;amp;N, &amp;amp;M);&lt;br /&gt;
	for (i = 1; i &amp;lt;= N; ++i) {&lt;br /&gt;
		for (j = 1; j &amp;lt;= M; ++j) {&lt;br /&gt;
			scanf(&amp;quot;%d&amp;quot;, &amp;amp;mat[i][j]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// calcularea solutiei&lt;br /&gt;
	int nrInsule = 0;&lt;br /&gt;
	for (i = 1; i &amp;lt;= N; ++i) {&lt;br /&gt;
		for (j = 1; j &amp;lt;= M; ++j) {&lt;br /&gt;
			if (mat[i][j] == 1) {&lt;br /&gt;
				fill(i, j, 1, nrInsule + 2);&lt;br /&gt;
				nrInsule++;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// afisarea solutiei&lt;br /&gt;
	printf(&amp;quot;%d\n&amp;quot;, nrInsule);&lt;br /&gt;
	return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ca și complexitate, vom avea complexitate O( n * m ) timp, O( n * m ) memorie&lt;br /&gt;
&lt;br /&gt;
==== Aplicații ====&lt;br /&gt;
* Găsire ieșire din labirint: găsirea unui punct (sau tuturor punctelor) de ieșire dintr-un labirint, dacă există.&lt;br /&gt;
* Calcul suprafață goluri: acesta este exemplul de mai sus, care numără elementele zero accesibile din punctul inițial.&lt;br /&gt;
* Calcul număr de goluri: denumite și componente conexe, putem folosi &#039;&#039;fill&#039;&#039; pentru a număra cîte goluri disjuncte există (astfel încît să nu se poată ajunge de la un gol la altul). Pentru aceasta vom parcurge matricea în orice ordine și vom porni cîte un &#039;&#039;fill&#039;&#039; din fiecare loc unde găsim un element &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Concluzie ====&lt;br /&gt;
&#039;&#039;Fill&#039;&#039; este o unealtă simplă și utilă, ușor de folosit la concursuri. Principalul ei neajuns este memoria ocupată. Ce facem în situația cînd matricea este prea mare și memoria disponibilă insuficientă pentru a folosi &#039;&#039;flood fill&#039;&#039;? În această situație putem folosi &#039;&#039;BFS fill&#039;&#039; (breadth first search), care, atunci cînd este aplicat pe o matrice se mai numește și algoritmul &#039;&#039;Lee&#039;&#039;. El folosește o coadă pentru a menține frontiera deja acoperită, reducînd memoria la O(m+n).&lt;br /&gt;
&lt;br /&gt;
===BFS ( Algoritmul lui Lee )===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;assert.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define MAX_N 100&lt;br /&gt;
#define MAX_M 100&lt;br /&gt;
&lt;br /&gt;
int mat[1 + MAX_N + 1][1 + MAX_M + 1];&lt;br /&gt;
int dist[1 + MAX_N + 1][1 + MAX_M + 1];&lt;br /&gt;
&lt;br /&gt;
int dirLin[] = {-1, -1, 0, 1, 1, 1, 0, -1};&lt;br /&gt;
int dirCol[] = { 0,  1, 1, 1, 0,-1,-1, -1};&lt;br /&gt;
&lt;br /&gt;
int linie[MAX_N * MAX_M];&lt;br /&gt;
int coloana[MAX_N * MAX_M];&lt;br /&gt;
int inceput, sfarsit;&lt;br /&gt;
&lt;br /&gt;
void fill(int l, int c, int vechi, int nou) {&lt;br /&gt;
  assert(mat[l][c] == vechi);&lt;br /&gt;
  // sunt sigur ca celula curenta are valoarea 1&lt;br /&gt;
  mat[l][c] = nou;&lt;br /&gt;
  int i;&lt;br /&gt;
  for (i = 0; i &amp;lt; 8; ++i) {&lt;br /&gt;
    if (mat[l + dirLin[i]][c + dirCol[i]] == vechi)&lt;br /&gt;
      fill(l + dirLin[i], c + dirCol[i], vechi, nou);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  int N, M;&lt;br /&gt;
  int i, j;&lt;br /&gt;
&lt;br /&gt;
  // citirea datelor&lt;br /&gt;
  scanf(&amp;quot;%d %d&amp;quot;, &amp;amp;N, &amp;amp;M);&lt;br /&gt;
  for (i = 1; i &amp;lt;= N; ++i) {&lt;br /&gt;
    for (j = 1; j &amp;lt;= M; ++j) {&lt;br /&gt;
      scanf(&amp;quot;%d&amp;quot;, &amp;amp;mat[i][j]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  int L, C;&lt;br /&gt;
  scanf(&amp;quot;%d %d&amp;quot;, &amp;amp;L, &amp;amp;C);&lt;br /&gt;
&lt;br /&gt;
  // calcularea solutiei&lt;br /&gt;
  for (i = 0; i &amp;lt;= N + 1; ++i) {&lt;br /&gt;
    for (j = 0; j &amp;lt;= M + 1; ++j) {&lt;br /&gt;
      dist[i][j] = -1;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  dist[L][C] = 0;&lt;br /&gt;
  int l, c;&lt;br /&gt;
  int vechi = 0;&lt;br /&gt;
  inceput = sfarsit = 0;&lt;br /&gt;
  linie[sfarsit] = L;&lt;br /&gt;
  coloana[sfarsit] = C;&lt;br /&gt;
  sfarsit++;&lt;br /&gt;
  while (inceput &amp;lt; sfarsit) {&lt;br /&gt;
    l = linie[inceput];&lt;br /&gt;
    c = coloana[inceput];&lt;br /&gt;
    inceput++;&lt;br /&gt;
    for (i = 0; i &amp;lt; 8; ++i) {&lt;br /&gt;
      if (mat[l + dirLin[i]][c + dirCol[i]] == 1 &amp;amp;&amp;amp; dist[l + dirLin[i]][c + dirCol[i]] == -1) {&lt;br /&gt;
	dist[l + dirLin[i]][c + dirCol[i]] = dist[l][c] + 1;&lt;br /&gt;
	linie[sfarsit] = l + dirLin[i];&lt;br /&gt;
	coloana[sfarsit] = c + dirCol[i];&lt;br /&gt;
	sfarsit++;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    ++vechi;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // afisarea solutiei&lt;br /&gt;
  for (i = 0; i &amp;lt;= N + 1; ++i) {&lt;br /&gt;
    for (j = 0; j &amp;lt;= M + 1; ++j) {&lt;br /&gt;
      if (dist[i][j] == -1) {&lt;br /&gt;
	printf(&amp;quot;  &amp;quot;);&lt;br /&gt;
      }   &lt;br /&gt;
      else {&lt;br /&gt;
	printf(&amp;quot;%1d &amp;quot;, dist[i][j]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
&lt;br /&gt;
6 8&lt;br /&gt;
0 0 0 0 0 0 0 0&lt;br /&gt;
0 1 0 1 1 0 0 0&lt;br /&gt;
0 1 0 1 1 1 0 0&lt;br /&gt;
0 1 1 1 1 0 0 0&lt;br /&gt;
0 0 1 0 1 1 0 0&lt;br /&gt;
0 0 0 0 0 0 0 0&lt;br /&gt;
3 4&lt;br /&gt;
 */&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Temă =&lt;br /&gt;
Rezolvati problemele ramase nerezolvate din lista de mai sus&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=844 Croco1]&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente 0 sau 1, care reprezintă harta unui lac, în care 0 înseamnă uscat, iar 1 înseamnă apă.&lt;br /&gt;
&lt;br /&gt;
Se dorește plasarea pe fiecare zonă cu uscat a unui crocodil sau a unui elefant astfel încât să nu fie două animale din aceeași specie în zone învecinate. În plus, se dorește ca numărul de crocodil să fie cât mai mare.&lt;br /&gt;
&lt;br /&gt;
Să se determine câți crocodili și câți elefanți se pot plasa pe lac, astfel încât numărul de crocodili să fie cât mai mare.&lt;br /&gt;
&lt;br /&gt;
[http://varena.ro/runda/2015-10-15-clasa-7-tema-5 Tema 5 clasa a 7-a]&lt;br /&gt;
* [http://varena.ro/problema/oras oras] ca aplicație de flood fill&lt;br /&gt;
* [http://varena.ro/problema/ce ce] ca aplicație de flood fill&lt;br /&gt;
* [http://varena.ro/problema/alee alee] ca aplicație de BFS &lt;br /&gt;
&lt;br /&gt;
Rezolvări aici [http://solpedia.francu.com/wiki/index.php/Clasa_a_VII-a_lec%C8%9Bia_5_-_15_oct_2015]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10&amp;diff=18019</id>
		<title>10</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10&amp;diff=18019"/>
		<updated>2020-10-30T16:50:35Z</updated>

		<summary type="html">&lt;p&gt;Bella: Created page with &amp;quot;* 10_2018 Lectia1 Recapitulare * 10_2018 Lectia2 Testare Initiala * 10_2018 Lectia3 Subprograme * 10_2018 Lectia4 Subprograme:Variabile locale variabile global...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[10_2018 Lectia1]] Recapitulare&lt;br /&gt;
* [[10_2018 Lectia2]] Testare Initiala&lt;br /&gt;
* [[10_2018 Lectia3]] Subprograme&lt;br /&gt;
* [[10_2018 Lectia4]] Subprograme:Variabile locale variabile globaleTransmiterea parametrilor&lt;br /&gt;
* [[10_2018 Lectia5]] Subprograme : Aplicatii bac&lt;br /&gt;
* [[10_2018 Lectia6]] Siruri de caractere&lt;br /&gt;
* [[10_2018 Lectia7]] Siruri de caractere&lt;br /&gt;
* [[10_2018 Lectia8]] &lt;br /&gt;
* [[10_2018 Lectia9]] Siruri de caractere Culegere &lt;br /&gt;
* [[10_2018 Lectia10]]&lt;br /&gt;
* [[10_2018 Lectia11]] &lt;br /&gt;
* [[10_2018 Lectia12]] &lt;br /&gt;
* [[10_2018 Lectia13]]&lt;br /&gt;
* [[10_2018 Lectia14]]&lt;br /&gt;
* [[10_2018 Lectia15]] Stiva - coada &lt;br /&gt;
* [[10_2018 Lectia16]] Stiva - coada continuare&lt;br /&gt;
* [[10_2018 Lectia17]] BFS&lt;br /&gt;
* [[10_2018 Lectia18]] Recapitulare semestriala&lt;br /&gt;
* [[10_2018 Lectia19]] s1 Recursivitate - introducere&lt;br /&gt;
* [[10_2018 Lectia20]] s2 Recursivitate - continuare&lt;br /&gt;
* [[10_2018 Lectia21]] s3 Recursivitate - Fill&lt;br /&gt;
* [[10_2018 Lectia22]] s4 Divide at Impera - Max, cmmdc,&lt;br /&gt;
* [[10_2018 Lectia23]] s5 Divide at Impera - Cautare binara; Lower_bound, Upper_bound&lt;br /&gt;
* [[10_2018 Lectia24]] s6 Divide at Impera - Quiqsort, Statistici de ordine, Merge Sort&lt;br /&gt;
* [[10_2018 Lectia25]] s7 Divide at Impera - Bucket Sort, Hanoi&lt;br /&gt;
* [[10_2018 Lectia26]] s8 Liste&lt;br /&gt;
* [[10_2018 Lectia27]] s9  - 23 apr&lt;br /&gt;
* [[10_2018 Lectia28]] s10 - 30 apr&lt;br /&gt;
* [[10_2018 Lectia29]] s11 -  7 mai&lt;br /&gt;
* [[10_2018 Lectia30]] s12 - 14 mai TEZA&lt;br /&gt;
* [[10_2018 Lectia31]] s13 - Liste dublu inlantuite - 21 mai&lt;br /&gt;
* [[10_2018 Lectia32]] s14 - 28 mai&lt;br /&gt;
* [[10_2018 Lectia33]] s15 -  4 iunie&lt;br /&gt;
* [[10_2018 Lectia34]] s16 - 11 iunie&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia3&amp;diff=17980</id>
		<title>10 2018 Lectia3</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2018_Lectia3&amp;diff=17980"/>
		<updated>2020-10-08T15:24:52Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Afisarea sumei divizorilor unui numar */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Subprograme =&lt;br /&gt;
== Studiu de caz - modularizarea unui program ==&lt;br /&gt;
=== De ce avem nevoie de subprograme ===&lt;br /&gt;
# pentru a evita scrierea de cod repetitiv; definirea unui subprogram ne permite executarea acestuia de mai multe ori, fara a scrie acelasi cod de in mod repetat; &lt;br /&gt;
# decompunerea problemei in subprobleme - facem asta deoarece subproblemele sunt parti de cod mai simplu de scris, de testat, de verificat si de inteles (in en: decomposition- medoda de a imparti problema in subprobleme).&lt;br /&gt;
# Modularizarea usureaza munca in echipa&lt;br /&gt;
Esista 2 modalitati de descompunere: &lt;br /&gt;
* top-down - when you try to define the most general functions first and then you divide them into simpler and more specialized ones)&lt;br /&gt;
* bottom up - when you start your work by creating a set of narrowly defined and highly specialized functions, and then assembling them into more complex structures&lt;br /&gt;
&lt;br /&gt;
== Tipuri de subprograme ==&lt;br /&gt;
Clasificare dupa autor&lt;br /&gt;
* &#039;&#039;&#039;Functii predefinite&#039;&#039;&#039; sau functii de biblioteca - sunt functii scrise de altcineva disponibile in bibliotecile mediului de programare &lt;br /&gt;
** ex1: in biblioteca cmath gasim functia &#039;&#039;&#039;abs&#039;&#039;&#039; care calculeaza val absoluta a numar, functia sqrt care calculeaza radicalul unui numar, etc&lt;br /&gt;
** ex2: in biblioteca cstring casim functii care prelucreaza siruri de caractere precum functia &#039;&#039;&#039;strlen&#039;&#039;&#039; care calculeaza lungimea unui sir, etc.&lt;br /&gt;
* &#039;&#039;&#039;Functii definite de utilizator&#039;&#039;&#039; - functii pe care le putem defini si utiliza in programul nostru&lt;br /&gt;
&lt;br /&gt;
Subprogramele pot fi de două tipuri:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;funcții&#039;&#039;&#039; – subprograme care determină un anumit rezultat, o anumită valoare, pornind de la anumite date de intrare. Spunem că valoarea este returnată de către funcție, iar aceasta va fi apelată ca operand într-o expresie, valoarea operandului în expresie fiind de fapt valoarea rezultatului funcției.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
int catecifre( int n ){&lt;br /&gt;
  int cnt = 0;&lt;br /&gt;
  while ( n ){&lt;br /&gt;
    cnt ++;&lt;br /&gt;
    n/=10;&lt;br /&gt;
  }&lt;br /&gt;
  return cnt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int e = 2034;&lt;br /&gt;
    cout &amp;lt;&amp;lt; catecifre ( e );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;proceduri&#039;&#039;&#039; – subprograme care se folosesc într-o instrucțiune de sine stătătoare, nu într-o expresie. Ele îndeplinesc o sarcină, au un efect și nu returnează un rezultat. De exemplu, citirea unor variabile, afișarea unor valori, transformarea unor date, etc.&lt;br /&gt;
Ex: Afisare primelor n numere naturale impare&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
void afisare(  int n ){&lt;br /&gt;
  int i = 1;&lt;br /&gt;
  while ( i &amp;lt;= n ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; 2 * i - 1 &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    i ++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int main(){&lt;br /&gt;
    int n = 5;&lt;br /&gt;
    afisare( n );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Transmiterea parametrilor ==&lt;br /&gt;
* prin valoare&lt;br /&gt;
* prin referinta (diferenta dintre c/c++)&lt;br /&gt;
&lt;br /&gt;
== Aplicatii subprograme ==&lt;br /&gt;
In acest laboator ne propunem sa recapitulam algoritimi studiati in anul anterior si totodata sa ii implementam sub forma de subprograme. Vom recapitula:&lt;br /&gt;
* algoritmilor elementari &lt;br /&gt;
** Prelucrarea cifrelor unui numar (numar palindrom)&lt;br /&gt;
** Algoritmi de divizibilitate ( cmmdc, cmmmc, primalitate, descompunere in factori primi&lt;br /&gt;
==== Numere palindrom ====&lt;br /&gt;
Algoritmul clasic verifică dacă numărul este egal cu răsturnatul său:&lt;br /&gt;
Avem şi o metodă mai apropiată de cea originală, în care răsturnăm numărul numai pînă la jumate:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n, r;&lt;br /&gt;
  scanf(&amp;quot;%lld&amp;quot;, &amp;amp;n );&lt;br /&gt;
&lt;br /&gt;
  if ( n &amp;gt; 0 &amp;amp;&amp;amp; n % 10 == 0 )&lt;br /&gt;
    printf(&amp;quot;NU\n&amp;quot;);&lt;br /&gt;
  else {&lt;br /&gt;
    r = 0;&lt;br /&gt;
    while( n &amp;gt; r ){&lt;br /&gt;
      r = r * 10 + n % 10;&lt;br /&gt;
      n = n / 10;&lt;br /&gt;
    }&lt;br /&gt;
    // cand numarul are un numar par de cifre testam daca p == r&lt;br /&gt;
    // cand numarul are un numar impar de cifre testam daca p == r / 10&lt;br /&gt;
    if( n == r || n ==(r /10))&lt;br /&gt;
      printf(&amp;quot;DA\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      printf(&amp;quot;NU\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Metoda: Rasturnam numarul pana la jumatate; Cum obtinem cele 2 jumatati? &lt;br /&gt;
Vom muta in r cifre din n pana cand r devine mai mare ca n. Atentie la numerele cu zerouri la coada. Ex: 5500 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int pali( long long n ){&lt;br /&gt;
  int r;&lt;br /&gt;
  if ( n &amp;gt; 0  &amp;amp;&amp;amp; n % 10 == 0 )&lt;br /&gt;
    return 0;&lt;br /&gt;
  r = 0;&lt;br /&gt;
  while ( n&amp;gt; r ) {&lt;br /&gt;
    r = r * 10 + n % 10;&lt;br /&gt;
    n = n / 10;&lt;br /&gt;
  }&lt;br /&gt;
  if ( n == r || n == ( r / 10 ) )&lt;br /&gt;
    return 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  long long n;&lt;br /&gt;
  scanf( &amp;quot;%lld&amp;quot;, &amp;amp;n );&lt;br /&gt;
  if( pali(n) ) &lt;br /&gt;
    printf( &amp;quot;este palindrom&amp;quot; );&lt;br /&gt;
  else&lt;br /&gt;
    printf( &amp;quot;nu este palindrom&amp;quot; );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
===Calculul cmmdc-ului===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
unsigned int cmmdc( unsigned int a, unsigned int b ){&lt;br /&gt;
  unsigned int r;&lt;br /&gt;
  while ( b &amp;gt; 0 ){&lt;br /&gt;
    r = a % b;&lt;br /&gt;
    a = b;&lt;br /&gt;
    b = r;&lt;br /&gt;
  }&lt;br /&gt;
return a;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  unsigned int a, b;&lt;br /&gt;
  scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;a, &amp;amp;b );&lt;br /&gt;
  printf( &amp;quot;%u&amp;quot;, cmmdc( a, b ) );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rezolvati in clasa:&lt;br /&gt;
* problema [http://varena.ro/problema/plaja2 plaja2]&lt;br /&gt;
* Scrieti un program similar care sa calculeze cmmmc-ul a doua numere&lt;br /&gt;
&lt;br /&gt;
===Calculul cmmmc-ului===&lt;br /&gt;
*[http://varena.ro/problema/plaja1 Plaja1] Problema se reduce la a calcula cmmmc a n numere.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include&amp;lt;fstream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
//prototipurile functilor pe care le vom defini.&lt;br /&gt;
int cmmdc(int ,int );&lt;br /&gt;
int cmmmc(int ,int );&lt;br /&gt;
//definirea functiilor anuntate prin prototipuri&lt;br /&gt;
int cmmdc(int a,int b){&lt;br /&gt;
    int r;&lt;br /&gt;
    while(b&amp;gt;0){&lt;br /&gt;
        r=a%b;&lt;br /&gt;
        a=b;&lt;br /&gt;
        b=r;&lt;br /&gt;
    }&lt;br /&gt;
    return a;&lt;br /&gt;
}&lt;br /&gt;
int cmmmc(int a,int b){&lt;br /&gt;
    return (a*b)/cmmdc(a,b);&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
    ifstream f(&amp;quot;plaja1.in&amp;quot;);&lt;br /&gt;
    ofstream g(&amp;quot;plaja1.out&amp;quot;);&lt;br /&gt;
    int n,i,x,y;&lt;br /&gt;
    f&amp;gt;&amp;gt;n;&lt;br /&gt;
    f&amp;gt;&amp;gt;x;               //citim o prima valoare din sir&lt;br /&gt;
    for(i=2;i&amp;lt;=n;i++){&lt;br /&gt;
        f&amp;gt;&amp;gt;y;           //citim o noua valoare din sir&lt;br /&gt;
        x=cmmmc(x,y);   //x va fi rescris cu valoarea cmmmc-ului dinte x si y.&lt;br /&gt;
    }&lt;br /&gt;
    g&amp;lt;&amp;lt;x;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
De retinut ca x si y sunt parametrii transmisi prin valoare, ca urmare functia cmmmc nu va putea modifica valoarea acestora.&lt;br /&gt;
&lt;br /&gt;
==== Afisarea tuturor divizorilor unui numar ====&lt;br /&gt;
Se citeste un numar natural n. Sa se afiseze toti divizorii acestuia in ordine crescatoare: &lt;br /&gt;
Ex: pentru n = 12 se vor afisa: 1 2 3 4 6 12&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, d;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  // afisam mai intai divizorii de pana in radical&lt;br /&gt;
  // vom parcurge deci sqrt(n) numere&lt;br /&gt;
  d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  // afisam divizorii de dupa radical&lt;br /&gt;
  // parcurgem divizorii de pana in radical in ordine inversa&lt;br /&gt;
  // si afisam perechea fiecaruia de dupa radical&lt;br /&gt;
  // vom parcurge deci tot sqrt(n) numere&lt;br /&gt;
  d = sqrt (n);&lt;br /&gt;
  while( d &amp;gt;= 1 ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; n / d &amp;lt;&amp;lt; &#039;\n&#039;;&lt;br /&gt;
    d = d - 1;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Scrieti in clasa un program similar care utilizeaza un subprogram pentru afisarea divizorilor&lt;br /&gt;
&lt;br /&gt;
 Folosind functii:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
void afisare_divizori ( int n ){&lt;br /&gt;
  // afisam mai intai divizorii de pana in radical&lt;br /&gt;
  // vom parcurge deci sqrt(n) numere&lt;br /&gt;
  int d = 1;&lt;br /&gt;
  while( d * d &amp;lt; n ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; d &amp;lt;&amp;lt;&#039; &#039;;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  // afisam divizorii de dupa radical&lt;br /&gt;
  // parcurgem divizorii de pana in radical in ordine inversa&lt;br /&gt;
  // si afisam perechea fiecaruia de dupa radical&lt;br /&gt;
  // vom parcurge deci tot sqrt(n) numere&lt;br /&gt;
  d = sqrt ( n );&lt;br /&gt;
  while( d &amp;gt;= 1 ){&lt;br /&gt;
    if( n % d == 0 )&lt;br /&gt;
      cout &amp;lt;&amp;lt; n / d &amp;lt;&amp;lt; &#039; &#039;;&lt;br /&gt;
    d = d - 1;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  int n;&lt;br /&gt;
&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  afisare_divizori (n);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Afisarea sumei divizorilor unui numar ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int suma_div(int n){&lt;br /&gt;
  int d, s;&lt;br /&gt;
  s = n+1;&lt;br /&gt;
  d=2;&lt;br /&gt;
  while ( d * d &amp;lt; n ) {&lt;br /&gt;
    if ( n % d == 0 )&lt;br /&gt;
      s = s + d + n / d;&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  }&lt;br /&gt;
  if( d * d == n)&lt;br /&gt;
    s = s + d;&lt;br /&gt;
  return s;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  int n;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  printf( &amp;quot;Suma Divizorilor lui %d este: %d&amp;quot;, n, suma_div(n) );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Descompunerea in factori primi ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
int n, div, exp;&lt;br /&gt;
&lt;br /&gt;
  scanf(&amp;quot;%d&amp;quot;,&amp;amp;n);&lt;br /&gt;
  div = 2;        //Incepem cautarea factorilor primi de la primul numar prim&lt;br /&gt;
  while( div * div &amp;lt;= n ){//Cautam factorii primi pana la radicalul lui n&lt;br /&gt;
    exp = 0;&lt;br /&gt;
    while( n % div == 0 ) {&lt;br /&gt;
      n /= div;&lt;br /&gt;
      exp ++;&lt;br /&gt;
    }&lt;br /&gt;
    if( exp &amp;gt; 0 )&lt;br /&gt;
      printf(&amp;quot;%d^%d\n&amp;quot;, div, exp );&lt;br /&gt;
    div ++;&lt;br /&gt;
  }  &lt;br /&gt;
  // daca n mai contine un factor, el este un numar prim la puterea unu&lt;br /&gt;
  if( n &amp;gt; 1 )&lt;br /&gt;
    printf(&amp;quot;%d^1\n&amp;quot;, n );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Primalitate ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, d;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  d = 2;&lt;br /&gt;
  while ( d*d &amp;lt;= n &amp;amp;&amp;amp; n % d &amp;gt; 0 )&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  if ( d*d &amp;gt; n )&lt;br /&gt;
    printf( &amp;quot;%d este prim\n&amp;quot;, n );&lt;br /&gt;
  else&lt;br /&gt;
    printf( &amp;quot;%d nu este prim\n&amp;quot;, n );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Cu functii:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int prim ( int n ) {&lt;br /&gt;
  int d;&lt;br /&gt;
  d = 2;&lt;br /&gt;
  while ( d * d &amp;lt;= n &amp;amp;&amp;amp; n % d &amp;gt; 0 )&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  if ( d * d &amp;gt; n )&lt;br /&gt;
    return 1;&lt;br /&gt;
  else&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  int n;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  if(prim(n))&lt;br /&gt;
    printf( &amp;quot;%d este prim\n&amp;quot;, n );&lt;br /&gt;
  else&lt;br /&gt;
    printf( &amp;quot;%d  nu este prim\n&amp;quot;, n );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aplicatie: Afisarea tuturor numerelor prime dintr-un sir de  n valori&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int prim (int n){&lt;br /&gt;
  int d;&lt;br /&gt;
  d = 2;&lt;br /&gt;
  while ( d * d &amp;lt;= n &amp;amp;&amp;amp; n % d &amp;gt; 0 )&lt;br /&gt;
    d = d + 1;&lt;br /&gt;
  if ( d * d &amp;gt; n )&lt;br /&gt;
    return 1;&lt;br /&gt;
  else&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i, nr, contor;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  contor=0;&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ ){&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;nr );&lt;br /&gt;
    if(prim(nr) == 1)&lt;br /&gt;
      contor++;&lt;br /&gt;
  }&lt;br /&gt;
  if(contor != 0)&lt;br /&gt;
    printf( &amp;quot;in sir sunt %d  numere prime\n&amp;quot;, contor );&lt;br /&gt;
  else&lt;br /&gt;
    printf( &amp;quot;in sir  nu sunt numere prime\n&amp;quot; );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Ciurul lui Eratostene ====&lt;br /&gt;
O metoda mai rapida de a rezolva problema de mai sus ar fi sa contruim un tablou unidimensional in care sa memoram pentru fiecare numar, daca este prim sau nu.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
char ciur[2000000];&lt;br /&gt;
void creare_ciur ( int n ){&lt;br /&gt;
  int d, i;&lt;br /&gt;
  for ( d = 2; d * d &amp;lt;= n; d ++ )&lt;br /&gt;
    if ( ciur[d] == 0 ) // daca d este prim&lt;br /&gt;
      for ( i = d * d; i &amp;lt;= n; i = i + d ) // vom marca numerele din d in d&lt;br /&gt;
        ciur[i] = 1;&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, i;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  creare_ciur(n);&lt;br /&gt;
  for( i = 2; i &amp;lt;= n; i++ )&lt;br /&gt;
    if( ciur[i] == 0 )&lt;br /&gt;
      printf( &amp;quot; %d  &amp;quot;, ciur[i] );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Sortarea a unui sir de n numere ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
void citire( int v[], int &amp;amp;n ){&lt;br /&gt;
  int i;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  i = 0;&lt;br /&gt;
  while ( i&amp;lt; n ){&lt;br /&gt;
    cin &amp;gt;&amp;gt; v[i];&lt;br /&gt;
    i++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
void afisare( int v[], int n ){&lt;br /&gt;
  int i;&lt;br /&gt;
  i = 0;&lt;br /&gt;
  while ( i &amp;lt; n ){&lt;br /&gt;
    cout &amp;lt;&amp;lt; v[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    i++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void myswap ( int &amp;amp;a, int &amp;amp;b ){&lt;br /&gt;
  int aux = a;&lt;br /&gt;
  a = b;&lt;br /&gt;
  b = aux;&lt;br /&gt;
}&lt;br /&gt;
void sortare( int v[], int n ){&lt;br /&gt;
  int i, j;&lt;br /&gt;
  for ( i = 0; i &amp;lt; n - 1; i ++ )&lt;br /&gt;
    for ( j = i + 1; j &amp;lt; n; j ++ )&lt;br /&gt;
      if ( v[i] &amp;gt; v[j] )&lt;br /&gt;
        myswap( v[i], v[j] );&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
    int a[100], n;&lt;br /&gt;
    citire( a, n );&lt;br /&gt;
    sortare ( a, n );&lt;br /&gt;
    afisare( a, n );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Interclasare vectori ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
void citire(FILE *f, int v[], int *n){&lt;br /&gt;
  int i;&lt;br /&gt;
  fscanf( f, &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  for ( i = 0; i &amp;lt; (*n); i++ )&lt;br /&gt;
    fscanf( f, &amp;quot;%d&amp;quot;, &amp;amp;v[i] );&lt;br /&gt;
}&lt;br /&gt;
void scrie( FILE *f, int v[], int n ) {&lt;br /&gt;
  int i;&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    fprintf( f, &amp;quot;%d &amp;quot;, v[i] );&lt;br /&gt;
  fprintf( f, &amp;quot;\n&amp;quot; );&lt;br /&gt;
}&lt;br /&gt;
void interclasare(int v1[], int n1, int v2[], int n2, int v3[], int *n3 ){&lt;br /&gt;
  int i1, i2, i3;&lt;br /&gt;
  i1 = i2 = i3 = 0;&lt;br /&gt;
  while ( i1 &amp;lt; n1 &amp;amp;&amp;amp; i2 &amp;lt; n2 )&lt;br /&gt;
    if ( v1[i1] &amp;lt; v2[i2] )&lt;br /&gt;
      v3[i3++] = v1[i1++];&lt;br /&gt;
    else&lt;br /&gt;
      v3[i3++] = v2[i2++];&lt;br /&gt;
  &lt;br /&gt;
  while ( i1 &amp;lt; n1 ) &lt;br /&gt;
    v3[i3++] = v1[i1++];&lt;br /&gt;
    &lt;br /&gt;
  while ( i2 &amp;lt; n2 ) &lt;br /&gt;
    v3[i3++] = v2[i2++];&lt;br /&gt;
      &lt;br /&gt;
  *n3 = n1 + n2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int a[100], b[100], c[100], na, nb, nc;&lt;br /&gt;
    FILE *fin =fopen( &amp;quot;interclasare.in&amp;quot;,&amp;quot;r&amp;quot; );&lt;br /&gt;
    citire(fin, a, &amp;amp;na);&lt;br /&gt;
    citire(fin, b, &amp;amp;nb);&lt;br /&gt;
    FILE *fout = fopen (&amp;quot;interclasare.out&amp;quot;, &amp;quot;w&amp;quot;);&lt;br /&gt;
    fclose( fin );&lt;br /&gt;
    interclasare( a, na, b, nb, c, &amp;amp;nc );&lt;br /&gt;
    fout = fopen( &amp;quot;interclasare.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
    scrie( fout,  c, nc);&lt;br /&gt;
    fclose( fout );&lt;br /&gt;
    return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=10_2020&amp;diff=17975</id>
		<title>10 2020</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=10_2020&amp;diff=17975"/>
		<updated>2020-10-08T15:10:17Z</updated>

		<summary type="html">&lt;p&gt;Bella: Created page with &amp;quot;* 10_2018 Lectia1 Recapitulare * 10_2018 Lectia2 Testare Initiala * 10_2018 Lectia3 Subprograme * 10_2018 Lectia4 Subprograme:Variabile locale variabile global...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [[10_2018 Lectia1]] Recapitulare&lt;br /&gt;
* [[10_2018 Lectia2]] Testare Initiala&lt;br /&gt;
* [[10_2018 Lectia3]] Subprograme&lt;br /&gt;
* [[10_2018 Lectia4]] Subprograme:Variabile locale variabile globaleTransmiterea parametrilor&lt;br /&gt;
* [[10_2018 Lectia5]] Subprograme : Aplicatii bac&lt;br /&gt;
* [[10_2018 Lectia6]] Siruri de caractere&lt;br /&gt;
* [[10_2018 Lectia7]] Siruri de caractere&lt;br /&gt;
* [[10_2018 Lectia8]] &lt;br /&gt;
* [[10_2018 Lectia9]] Siruri de caractere Culegere &lt;br /&gt;
* [[10_2018 Lectia10]]&lt;br /&gt;
* [[10_2018 Lectia11]] &lt;br /&gt;
* [[10_2018 Lectia12]] &lt;br /&gt;
* [[10_2018 Lectia13]]&lt;br /&gt;
* [[10_2018 Lectia14]]&lt;br /&gt;
* [[10_2018 Lectia15]] Stiva - coada &lt;br /&gt;
* [[10_2018 Lectia16]] Stiva - coada continuare&lt;br /&gt;
* [[10_2018 Lectia17]] BFS&lt;br /&gt;
* [[10_2018 Lectia18]] Recapitulare semestriala&lt;br /&gt;
* [[10_2018 Lectia19]] s1 Recursivitate - introducere&lt;br /&gt;
* [[10_2018 Lectia20]] s2 Recursivitate - continuare&lt;br /&gt;
* [[10_2018 Lectia21]] s3 Recursivitate - Fill&lt;br /&gt;
* [[10_2018 Lectia22]] s4 Divide at Impera - Max, cmmdc,&lt;br /&gt;
* [[10_2018 Lectia23]] s5 Divide at Impera - Cautare binara; Lower_bound, Upper_bound&lt;br /&gt;
* [[10_2018 Lectia24]] s6 Divide at Impera - Quiqsort, Statistici de ordine, Merge Sort&lt;br /&gt;
* [[10_2018 Lectia25]] s7 Divide at Impera - Bucket Sort, Hanoi&lt;br /&gt;
* [[10_2018 Lectia26]] s8 Liste&lt;br /&gt;
* [[10_2018 Lectia27]] s9  - 23 apr&lt;br /&gt;
* [[10_2018 Lectia28]] s10 - 30 apr&lt;br /&gt;
* [[10_2018 Lectia29]] s11 -  7 mai&lt;br /&gt;
* [[10_2018 Lectia30]] s12 - 14 mai TEZA&lt;br /&gt;
* [[10_2018 Lectia31]] s13 - Liste dublu inlantuite - 21 mai&lt;br /&gt;
* [[10_2018 Lectia32]] s14 - 28 mai&lt;br /&gt;
* [[10_2018 Lectia33]] s15 -  4 iunie&lt;br /&gt;
* [[10_2018 Lectia34]] s16 - 11 iunie&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_5&amp;diff=17968</id>
		<title>Clasa a IX-a lecția 5</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_5&amp;diff=17968"/>
		<updated>2020-10-01T16:04:36Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Reguli minime de editare cod */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note de curs: prof. Isabela Coman&#039;&#039;&#039;&lt;br /&gt;
= Lectie =&lt;br /&gt;
&lt;br /&gt;
== Structura repetitiva &#039;&#039;&#039;while do&#039;&#039;&#039; ==&lt;br /&gt;
Structura repetitivă de tip WHILE-DO (cîtă timp - execută) reprezinta structura de control cu ajutorul careia executam un set de instructiuni, de mai multe ori, in functie de o conditie. Conditia se testeaza imediat la intrarea in structura repetitiva, de aceea, “while-do” se numeste structura repetitiva conditionata anterior.&lt;br /&gt;
&lt;br /&gt;
[[Image:sl-while-do.gif|frame|none|Structura repetitivă de tip WHILE-DO]]&lt;br /&gt;
Pseudocod&lt;br /&gt;
 Cat_timp(cond)executa&lt;br /&gt;
   Prel&lt;br /&gt;
&lt;br /&gt;
C/C++&lt;br /&gt;
 while(cond){&lt;br /&gt;
   Prel;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Mecanism:&lt;br /&gt;
* Pas1. Se testeaza conditia. Daca conditia este adevarata atunci trecem la pasul 2. Daca conditia este falsa se trece la pasul 3&lt;br /&gt;
* Pasul 2: Se executa pachetul de instructiuni “Prel” si se revine la pasul 1.&lt;br /&gt;
* Pasul 3. Stop&lt;br /&gt;
&lt;br /&gt;
== Aplicatii ==&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=327 AfisareNumere] ===&lt;br /&gt;
Se dă un număr natural n. Afișați în ordine crescătoare primele n numere naturale nenule.&lt;br /&gt;
&#039;&#039;&#039;Pseudocod&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
    intreg n, i;&lt;br /&gt;
    citeste n;&lt;br /&gt;
    i &amp;lt;- 1; &lt;br /&gt;
    cat_timp( i &amp;lt;= n )      &lt;br /&gt;
      scrie i, &amp;quot; &amp;quot;;&lt;br /&gt;
      i &amp;lt;- i + 1;                   &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;C++&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, i;&lt;br /&gt;
    cin &amp;gt;&amp;gt; n;&lt;br /&gt;
    i = 1; &lt;br /&gt;
    while( i &amp;lt;= n ){       &lt;br /&gt;
      cout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
      i++;                    // i = i + 1;&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cifra de control ====&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=340 Cifra de control Pbinfo]&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  cout &amp;lt;&amp;lt; ( n - 1 ) % 9 + 1;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  intreg n, s;&lt;br /&gt;
  citeste n;&lt;br /&gt;
  cat timp ( n &amp;gt; 9 ) executa       // cata vreme numarul are mai mult de o cifra&lt;br /&gt;
    s = 0;&lt;br /&gt;
    cat_timp ( n &amp;gt; 0 ) executa&lt;br /&gt;
      s = s + n mod 10;&lt;br /&gt;
      n = n div 10;&lt;br /&gt;
    n = s;&lt;br /&gt;
  scrie n;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, s;&lt;br /&gt;
  cin &amp;gt;&amp;gt; n;&lt;br /&gt;
  while ( n &amp;gt; 9 ){&lt;br /&gt;
    s = 0;&lt;br /&gt;
    while ( n &amp;gt; 0 ){&lt;br /&gt;
      s += n % 10;&lt;br /&gt;
      n = n / 10;&lt;br /&gt;
    }&lt;br /&gt;
    n = s;&lt;br /&gt;
  }&lt;br /&gt;
  cout &amp;lt;&amp;lt; n;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [http://varena.ro/problema/cifra cifra de control]&lt;br /&gt;
&lt;br /&gt;
  intreg n, i, c;&lt;br /&gt;
  citeste n, c;&lt;br /&gt;
  i &amp;lt;- c;&lt;br /&gt;
  while ( i &amp;lt;= n )&lt;br /&gt;
    scrie i, &amp;quot; &amp;quot;;&lt;br /&gt;
    i &amp;lt;- i + 9;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;cifra.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;cifra.out&amp;quot; );&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, i, c;&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; c;&lt;br /&gt;
  i = c;&lt;br /&gt;
  while ( i &amp;lt;= n ){&lt;br /&gt;
    fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    i += 9;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LABORATOR ==&lt;br /&gt;
===2 la n ===&lt;br /&gt;
Sa se calculeze 2  la puterea n.&lt;br /&gt;
  intreg n, contor;&lt;br /&gt;
  citeste n;&lt;br /&gt;
  contor = 0; &lt;br /&gt;
  p = 1;&lt;br /&gt;
  while ( contor &amp;lt; n ) &lt;br /&gt;
    p = p * 2;&lt;br /&gt;
    contor &amp;lt;- contor + 1;&lt;br /&gt;
  scrie  p;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int n, contor;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n );&lt;br /&gt;
  contor = 0; &lt;br /&gt;
  p = 1;&lt;br /&gt;
  while (  contor &amp;lt; n ) {&lt;br /&gt;
    p = p * 2;&lt;br /&gt;
    contor ++;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d &amp;quot;, p );&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ridicarea la putere se poate face si in timp logaritmic astfel:&lt;br /&gt;
&lt;br /&gt;
*Dacă &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; este par, atunci &amp;lt;tt&amp;gt;a&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; = a&amp;lt;sup&amp;gt;2*n/2&amp;lt;/sup&amp;gt; = (a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;n/2&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
*Dacă &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; este impar, atunci &amp;lt;tt&amp;gt;n-1&amp;lt;/tt&amp;gt; este par și avem &amp;lt;tt&amp;gt;a&amp;lt;sup&amp;gt;n&amp;lt;/sup&amp;gt; = a * a&amp;lt;sup&amp;gt;n-1&amp;lt;/sup&amp;gt; =  a * a&amp;lt;sup&amp;gt;2*(n-1)/2&amp;lt;/sup&amp;gt; = a * (a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;(n-1)/2&amp;lt;/sup&amp;gt; = a * (a&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;)&amp;lt;sup&amp;gt;n/2&amp;lt;/sup&amp;gt;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
În formulele de mai sus am considerat că &amp;lt;tt&amp;gt;/&amp;lt;/tt&amp;gt; este împărțirea întreagă din limbajul C. Se observă că indiferent de paritatea lui &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt;, la fiecare pas al iterației putem transforma &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; în &amp;lt;tt&amp;gt;a * a&amp;lt;/tt&amp;gt; și apoi putem împărți &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; la &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt;. Doar în cazurile cînd &amp;lt;tt&amp;gt;n&amp;lt;/tt&amp;gt; este impar vom acumula valoarea curentă a lui &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; la produsul calculat. Complexitatea acestei soluţii va fi logaritmică, O(log n). Ce înseamnă acest lucru? Că timpul necesar calculului este proporţional cu un număr &#039;&#039;k&#039;&#039;, unde &#039;&#039;k&#039;&#039; este exponentul lui 2 astfel încît &#039;&#039;2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;=n&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Iată soluția bazată pe această idee:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  int a, n, p;&lt;br /&gt;
&lt;br /&gt;
  scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;a, &amp;amp;n );&lt;br /&gt;
  p = 1;&lt;br /&gt;
  while ( n &amp;gt; 0 ) {&lt;br /&gt;
    if (n % 2 == 1)&lt;br /&gt;
      p = p * a;&lt;br /&gt;
    a = a * a;&lt;br /&gt;
    n = n / 2;&lt;br /&gt;
  }&lt;br /&gt;
  printf( &amp;quot;%d&amp;quot;, p );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Citire/ scriere in C/c++ ==&lt;br /&gt;
&lt;br /&gt;
* [http://lbi.ro//~bella/9/03%20Elemente%20de%20baza/1_Citire_scriere.pdf Citire/Scriere]&lt;br /&gt;
&lt;br /&gt;
== Instalare codeblocks ==&lt;br /&gt;
&lt;br /&gt;
* Instalați codeblocks [http://sourceforge.net/projects/codeblocks/files/Binaries/16.01/Windows/codeblocks-16.01mingw-setup.exe Code::Blocks].&lt;br /&gt;
&lt;br /&gt;
== Reguli minime de editare cod == &lt;br /&gt;
* acolada care deschide un bloc de intructiuni va fi pe aceeasi linie cu structura care il contine: &lt;br /&gt;
* identarea la 2 spatii, &lt;br /&gt;
&lt;br /&gt;
Ex:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int main() {&lt;br /&gt;
  if ( conditie ) {&lt;br /&gt;
    instructiune1;&lt;br /&gt;
  } &lt;br /&gt;
  else if ( conditie ) {&lt;br /&gt;
    instructiune2;&lt;br /&gt;
  } &lt;br /&gt;
  else {&lt;br /&gt;
    instructiune3;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
== TEMA Teorie ==&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=330 AfisareNumerePare]&lt;br /&gt;
Se dă un număr natural n. Afișați în ordine crescătoare primele n numere naturale pare nenule.&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=328 AfisareNumere1]&lt;br /&gt;
Se dă un număr natural n. Afișați în ordine descrescătoare primele n numere naturale nenule.&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/331/afisarenumereimpare AfisareNumereImpare]&lt;br /&gt;
Se dă un număr natural n. Afișați în ordine descrescătoare primele n numere naturale impare.&lt;br /&gt;
Se dă un număr natural n. Afișați în ordine crescătoare primele n numere naturale pare nenule.&lt;br /&gt;
* Scrieti in pseudocod algoritmii de rezolvare pentru problema  “palindrom”.&lt;br /&gt;
&lt;br /&gt;
== Tema 5 Laborator ==&lt;br /&gt;
* [http://varena.ro/problema/cangur Cangur] &lt;br /&gt;
* [http://varena.ro/problema/economii Economii]&lt;br /&gt;
* [http://varena.ro/problema/minute Minute]&lt;br /&gt;
* (usoara)  Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.&lt;br /&gt;
* (medie)   Se citeste un numar n. Afisati cifra de control a numarul n. Cifra de control se obtine prin adunarea repetata a cifrelor numarului pana cand se obtine o singura cifra.&lt;br /&gt;
Ex: n=193 s=1+9+3=13 s=1+3=4&lt;br /&gt;
* (dificila)Se citeste un numar n. Sa se afiseze cel mai apropiat fata de n numar palindrom.&lt;br /&gt;
Ex1: 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122&lt;br /&gt;
Ex2: 452 , afisam 454; nr 452 este cuprins intre 444 si 454&lt;br /&gt;
&lt;br /&gt;
=== Suplimentar: ===&lt;br /&gt;
&lt;br /&gt;
Ca aplicatie la ridicarea la putere:&lt;br /&gt;
&lt;br /&gt;
* [http://www.infoarena.ro/problema/modulo modulo]&lt;br /&gt;
&lt;br /&gt;
Probleme OJI :&lt;br /&gt;
&lt;br /&gt;
* [http://varena.ro/runda/oji_2017_9 Runda_OJI]&lt;br /&gt;
* [https://codeforces.com/contest/440/problem/A A. Forgotten Episode]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_31&amp;diff=17790</id>
		<title>Clasa a IX-a lecția 31</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_31&amp;diff=17790"/>
		<updated>2020-05-15T10:47:42Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Matrice patratica ==&lt;br /&gt;
O matrice patratica este o matrice in care numarul de  linii este egal cu numarul de coloane ( n = m ) &lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea diagonalei principale ===&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:Diagonala_principala.png|frame|none|Diagonala principală]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;Putem observa ca pentru fiecare element al diagonalei, indicele de linie estew egal cu indicele de coloana&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
for( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
      printf ( &amp;quot;%d  &amp;quot;, a[i][i] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Aplicatie: Suma elementelor de pe diagonala principala ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
s = 0;&lt;br /&gt;
for( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
   s += a[i][i];&lt;br /&gt;
printf ( &amp;quot;%d&amp;quot;, s );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===  Parcurgerea diagonalei secundare ===&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:Diagonala_secundara.png|frame|none|Diagonala Secundara]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;Putem observa ca pentru fiecare element al diagonalei, suma sintre indicele de linie si cel de coloana este n-1&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    printf ( &amp;quot;%d  &amp;quot;, a[i][n-i-1] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== Aplicatie: Cate numere pare sunt pe diagonala secundara ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int cnt = 0;&lt;br /&gt;
for (i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    if ( a[i][n-i-1] % 2 == 0)&lt;br /&gt;
         cnt ++;&lt;br /&gt;
printf ( &amp;quot;%d &amp;quot;, cnt );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// fara if&lt;br /&gt;
int cnt = 0;&lt;br /&gt;
for (i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    cnt += ( 1 - a[i][n-i-1] % 2 ) ;&lt;br /&gt;
printf ( &amp;quot;%d &amp;quot;, cnt );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// fara if&lt;br /&gt;
int cnt = 0;&lt;br /&gt;
for (i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    cnt += a[i][n-i-1] % 2 ; // numaram imparele&lt;br /&gt;
printf ( &amp;quot;%d &amp;quot;, n - cnt );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Elemente de deasupra si de sub diagonala principala ===&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:diagonala_principala_triunghiuri.png|frame|none|Analizati elementele de deasupra diagonalei principale si cele de sub diagonala principala]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
//Parcurgerea elementelor de deasupra diagonalei principale&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for ( j = i + 1; j &amp;lt; n; j++ )&lt;br /&gt;
    printf ( &amp;quot;%d &amp;quot;, a[i][j] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
//Parcurgerea elementelor de sub diagonala principala&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for ( j = 0; j &amp;lt; i; j++ )&lt;br /&gt;
    printf ( &amp;quot;%d &amp;quot;, a[i][j] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Aplicatie ====&lt;br /&gt;
Cate elemente distincte sunt deasupra diagonalei principale. Matricea are ca elemente valori intre 1 si 1000. Dimensiunea matricei este 1&amp;lt;n&amp;lt;= 100&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
for ( i = 0; i &amp;lt;= 1000; i++ ) &lt;br /&gt;
  v[i] = 0;&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for ( j = i + 1; j &amp;lt; n; j++ )&lt;br /&gt;
    v[a[i][j]]++;&lt;br /&gt;
cnt = 0;&lt;br /&gt;
for( i = 0; i &amp;lt;= 1000; i++)&lt;br /&gt;
  if( v[i] != 0 )&lt;br /&gt;
    cnt++;&lt;br /&gt;
cout &amp;lt;&amp;lt; cnt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// mai elegant :)&lt;br /&gt;
for ( i = 0; i &amp;lt;= 1000; i++ ) &lt;br /&gt;
  v[i] = 0;&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for ( j = i + 1; j &amp;lt; n; j++ )&lt;br /&gt;
    v[a[i][j]] = 1;&lt;br /&gt;
cnt = 0;&lt;br /&gt;
for( i = 0; i &amp;lt;= 1000; i++)&lt;br /&gt;
      cnt += v[i];&lt;br /&gt;
cout &amp;lt;&amp;lt; cnt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Elemente de deasupra si de sub diagonala secundara ===&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:diagonala_secundara_triunghiuri.png|frame|none|Analizati elementele de deasupra si cele de sub diagonala secundara]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
//Parcurgerea elementelor de deasupra diagonalei secundare&lt;br /&gt;
for (i=0;i&amp;lt;n;i++) &lt;br /&gt;
  for (j=0; j &amp;lt; n-i-1; j++ )&lt;br /&gt;
    printf (&amp;quot;%d &amp;quot;, a[i][j]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
//Parcurgerea elementelor de sub diagonala secundara&lt;br /&gt;
for (i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for ( j = n-i; j &amp;lt; n; j++ )&lt;br /&gt;
    printf ( &amp;quot;%d &amp;quot;, a[i][j] );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Aplicatie: Produsul elementelor nenule de deasupra diagonalei secundare ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
long long p = 1;&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for (j = 0; j &amp;lt; n - i - 1; j++ )&lt;br /&gt;
    if( v[i][j] )&lt;br /&gt;
       p *= v[i][j];&lt;br /&gt;
printf(&amp;quot;%lld&amp;quot;, p); &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Aplicatie: Cate numere prime sunt sub diagonala secundara ====&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
contor = 0;&lt;br /&gt;
for (i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for ( j = n - i; j &amp;lt; n; j++ ){&lt;br /&gt;
    //verificam daca  a[i][j] este prim&lt;br /&gt;
    d = 2;&lt;br /&gt;
    while ( d * d &amp;lt; a[i][j] &amp;amp;&amp;amp; a[i][j] % d != 0 )&lt;br /&gt;
      d++;&lt;br /&gt;
    if ( d * d == a[i][j] )&lt;br /&gt;
      contor ++;  &lt;br /&gt;
  }&lt;br /&gt;
printf ( &amp;quot;%d&amp;quot;, contor );&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Oglindire matrice fata de diagonala principala ===&lt;br /&gt;
* Temă în clasă&lt;br /&gt;
[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=786 Matsim]: se dă o matrice pătrată, să se modifice astfel încît în final elementele ei să fie oglindite față de diagonala principală. Diagonala principală e cea care începe în colțul din stînga-sus și se termină în colțul din dreapta-jos. Această operațiune se mai numește si &#039;&#039;transpunere&#039;&#039;.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;for ( i = 1; i &amp;lt; n; i++ )&lt;br /&gt;
  for ( j = 0; j &amp;lt; i; j++ ) {&lt;br /&gt;
    aux = a[i][j];&lt;br /&gt;
    a[i][j] = a[j][i];&lt;br /&gt;
    a[j][i] = aux;&lt;br /&gt;
  }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=787 Matsim1] Aceeași problemă pentru diagonala secundară. Diagonala secundară e cea care începe în colțul din dreapta-sus și se termină în colțul din stînga-jos&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;for ( i = 0; i &amp;lt; (n - 1); i++ )&lt;br /&gt;
  for ( j = 0; j &amp;lt; (n - i); j++ ) {&lt;br /&gt;
    aux = a[i][j];&lt;br /&gt;
    a[i][j] = a[n - 1 - j][n - 1 - i];&lt;br /&gt;
    a[n - 1 - j][n - 1 - i] = aux;&lt;br /&gt;
  }&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Parcurgerea zonelor delimitate de cele 2 diagonale [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1749 #1749 Zona4] ====&lt;br /&gt;
Considerăm o matrice pătratică cu N linii și N coloane. În această matrice sunt definite 4 zone:&lt;br /&gt;
&lt;br /&gt;
*zona 1, formată din elementele situate strict deasupra diagonalei principale și strict deasupra diagonalei secundare;&lt;br /&gt;
*zona 2, formată din elementele situate strict deasupra diagonalei principale și strict sub diagonala secundară;&lt;br /&gt;
*zona 3, formată din elementele situate strict sub diagonala principală și strict sub diagonala secundară;&lt;br /&gt;
*zona 4, formată din elementele situate strict sub diagonala principală și strict deasupra diagonalei secundare;&lt;br /&gt;
Se dă o matrice pătratică și un număr natural Z, reprezentând o zonă din matrice. Să se determine suma elementelor din zona Z.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:patru_zone.png|frame|none|Parcurgerea pe diagonala a matricei]]&lt;br /&gt;
|-&lt;br /&gt;
| Problema se reduce la a afisa pe rand elementele diagonalelor. avem 2n-1 diagonale.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Teorie ==&lt;br /&gt;
Rezolvati urmatoarele probleme de pe pbinfo.ro: &lt;br /&gt;
Zone1 , MedPoz , MatSim1 , Diagonale1 , Diagonale , Chenar , MatSim , CmmdcSum , Zona4 ; Optional: decodificare , Iceberg&lt;br /&gt;
=== Diagonale ===&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Calculaţi diferenţa în valoare absolută dintre sumele elementelor de pe cele două diagonale.&lt;br /&gt;
&lt;br /&gt;
===#783 Diagonale1===&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se determine suma elementelor de pe cele două diagonale vecine cu diagonala principală.&lt;br /&gt;
&lt;br /&gt;
===#780 CmmdcSum ===&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Calculaţi cel mai mare divizor comun al sumei elementelor de deasupra diagonalei principale și al sumei elementelor de sub diagonala principală.&lt;br /&gt;
&lt;br /&gt;
===#786 MatSim ===&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se construiască o matrice care să fie simetrica față de diagonala principală a matricei date.&lt;br /&gt;
&lt;br /&gt;
===#787 MatSim1 ( discutata in clasa ) ===&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se construiască o matrice care să fie simetrica față de diagonala secundară a matricei date.&lt;br /&gt;
&lt;br /&gt;
=== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1749 #1749 Zona4] ( discutata in clasa ) ===&lt;br /&gt;
Considerăm o matrice pătratică cu N linii și N coloane. În această matrice sunt definite 4 zone:&lt;br /&gt;
&lt;br /&gt;
zona 1, formată din elementele situate strict deasupra diagonalei principale și strict deasupra diagonalei secundare;&lt;br /&gt;
zona 2, formată din elementele situate strict deasupra diagonalei principale și strict sub diagonala secundară;&lt;br /&gt;
zona 3, formată din elementele situate strict sub diagonala principală și strict sub diagonala secundară;&lt;br /&gt;
zona 4, formată din elementele situate strict sub diagonala principală și strict deasupra diagonalei secundare;&lt;br /&gt;
Se dă o matrice pătratică și un număr natural Z, reprezentând o zonă din matrice. Să se determine suma elementelor din zona Z.&lt;br /&gt;
&lt;br /&gt;
=== #781 Zone1 ===&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se afişeze, în ordine crescătoare, sumele elementelor din cele patru zone delimitate de diagonale.&lt;br /&gt;
===MedPoz===&lt;br /&gt;
Se dă o matrice cu elemente numere întregi. Să se determine media aritmetică a elementelor strict pozitive din matrice, care sunt situate sub diagonala principală.&lt;br /&gt;
&lt;br /&gt;
== LABORATOR ==&lt;br /&gt;
Rezolvati urmatoarele probleme de pe pbinfo:&lt;br /&gt;
 Spirala , LinColEgale , Zona , Zona1 , Matrice6 , Matrice ,  MinCols1 , modifMat , Spirala1 , Criptare ,  Serpuire , wisp&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=210 Chenar] ====&lt;br /&gt;
( Parcurgerea elementelror de pe chenarul unei matrice )&lt;br /&gt;
Să se parcurgă în sensul acelor de ceasornic chenarul exterior al unei matrice pătratice.&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=211 spirala] ====&lt;br /&gt;
Să se parcurgă o matrice pătratică în spirală în sensul acelor de ceasornic.&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:spirala.png|frame|none|Diagonala principală]]&lt;br /&gt;
|-&lt;br /&gt;
| Putem observa ca matricea poate fi descompusa in &#039;&#039;(n+1)/2&#039;&#039;&#039;&#039; chenare si ca fiecare chenar &#039;&#039;&#039;k&#039;&#039;&#039; poate fi descompus la randul lui in 4 laturi. Putem tipari deci cele 4 laturi, fiind atenti ca elementele comune sa fie parcurse doar odata &lt;br /&gt;
|}&lt;br /&gt;
====#784 LinColEgale====	&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se determine câte elemente ale matricei se află pe linii și coloane de sumă egală.&lt;br /&gt;
&lt;br /&gt;
====#81 Matrice====	&lt;br /&gt;
Scrieţi un program care citeşte de la tastatură un tablou bidimensional cu n linii şi n coloane și afişează pe ecran numărul valorilor din tablou care sunt strict mai mari decât toți vecinii lor.&lt;br /&gt;
&lt;br /&gt;
====#998 Matrice6====	&lt;br /&gt;
Se consideră o matrice pătratică cu n linii şi n coloane şi elemente numere naturale. Să se modifice matricea în felul următor: toate elementele de pe liniile care conţin valoare maximă din matrice vor fi mărite cu valoarea minimă din matrice.&lt;br /&gt;
&lt;br /&gt;
====#729 Zona	====&lt;br /&gt;
Se dă o matrice pătratică cu n linii și n coloane și elemente numere naturale mai mici decât 1000. Să se afișeze în ordine strict crescătoare valorile situate sub diagonala principală și deasupra diagonalei secundare. Dacă o valoare apare în zona respectivă de mai multe ori, se va afișa o singură dată.&lt;br /&gt;
 &lt;br /&gt;
====#782 Zona1====	&lt;br /&gt;
Se dă o matrice pătratică cu n linii și n coloane și elemente numere naturale mai mici decât 1000. Să se afișeze în ordine strict crescătoare valorile care apar sub diagonala principală și sub diagonală secundara de cel puţin 2 ori. Fiecare valoare se va afişa o singură dată.&lt;br /&gt;
====Serpuire====	&lt;br /&gt;
Se dă o matrice cu n linii şi n coloane şi elemente numere naturale. Să se afișeze elementele prin parcurgerea șerpuită a matricei, începând din elementul de pe prima linie și prima coloană, ca în exemplu.&lt;br /&gt;
==== [http://varena.ro/problema/diagonal Diagonal] ====&lt;br /&gt;
&lt;br /&gt;
Se citeşte o matrice pătrată de caractere. Să se afişeze două linii de caractere, fiecare linie conţinînd toate caracterele matricei. Prima linie afişată conţine caracterele matricei în parcurgerea pe diagonale paralele cu diagonala principală. A doua linie afişată conţine caracterele matricei în parcurgerea pe diagonale paralele cu diagonala secundară. Diagonala principală este din coţul stînga sus în colţul dreapta jos. Diagonala secundară este din colţul dreapta sus, în colţul dreapta jos. Atenţie! Fişierul de intrare conţine numai matricea de caractere, fiecare linie terminîndu-se cu &#039;\n&#039;. Nu se dă n, dimensiunea matricei, trebuie sa o deduceţi. &lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:matr-parcurg-diag-princ.gif|frame|none|Parcurgerea pe diagonale paralele cu diagonala principală]]&lt;br /&gt;
| [[Image:matr-parcurg-diag-sec.gif|frame|none|Parcurgerea pe diagonale paralele cu diagonala secundară]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;center&amp;gt;Prima linie afișată: &#039;&#039;minejoafkpbglchd&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
| &amp;lt;center&amp;gt;A doua linie afișată: &#039;&#039;abecfidgjmhknlop&#039;&#039;&amp;lt;/center&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;&amp;quot;&lt;br /&gt;
| [[Image:diagonal.png|frame|none|Parcurgerea pe diagonala a matricei]]&lt;br /&gt;
|-&lt;br /&gt;
| Problema se reduce la a afisa pe rand elementele diagonalelor. avem 2n-1 diagonale.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
====MinCols1====	&lt;br /&gt;
Se dă o matrice cu elemente numere naturale. Să se determine ultima cifră a produsului elementelor de pe diagonala secundară cu proprietatea că sunt minime pe coloanele lor.&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1008 Spirala1] (pbinfo)	&lt;br /&gt;
Se dau n numere naturale, un n este un pătrat perfect. Să se construiască în memorie o matrice pătratică cu toate cele n numere, în spirală, în sens invers acelor de ceas astfel: pe prima coloană, începând cu linia 1, se vor trece primele elemente din şir (de sus în jos), apoi pe ultima linie, începând de la prima coloană până la ultima (de la stânga la dreapta), apoi pe ultima coloană, de la ultima linie la prima (de jos în sus), apoi pe prima linie, de la ultima coloană la prima (de la dreapta la stânga) şamd.&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1487 #1487 decodificare] ====	&lt;br /&gt;
Scrieţi un program care, citind din fişierul de intrare şirul de caractere cod(s), execută operaţia de decodificare şi afişează textul iniţial s (care a fost codificat) în fişierul de ieşire.&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1451 #1451 Iceberg] ====	&lt;br /&gt;
Se dă o matrice reprezentând o zonă dintr-un ocean ce conține un iceberg; valorile egale cu 1 fac parte din iceberg, iar cele egale cu 0 reprezintă apă.&lt;br /&gt;
&lt;br /&gt;
Se știe că icebergul este înconjurat de apa (nu există nici o valoare de 1 pe marginea matricei) și că într-un interval de timp se topesc toate zonele icebergului care au cel puțin doua laturi vecine cu apa.&lt;br /&gt;
&lt;br /&gt;
Determinați și afișați cate intervale de timp sunt necesare ca icebergul să se topească în întregime. De asemenea, afișați pentru fiecare interval de timp câte poziții de gheață are icebergul la începutul intervalului.&lt;br /&gt;
&lt;br /&gt;
= Tema Laborator =&lt;br /&gt;
Rezolvati problemele din fisa de la laborator ramase nerezolvate &lt;br /&gt;
* [http://varena.ro/problema/diagonal diagonal] -  parcurgerea elementelor unei matrice&lt;br /&gt;
* [http://varena.ro/problema/zoomx2 zoomx2] - generare matrice pe baza unei matrice date&lt;br /&gt;
* [http://varena.ro/problema/cautare căutare] - cautare submatrice in matrice&lt;br /&gt;
[http://isa.algopedia.ro/wiki/index.php/nrapp Rez] [http://isa.algopedia.ro/wiki/index.php/cautare Rez]&lt;br /&gt;
[http://isa.algopedia.ro/wiki/index.php/nrapp Rez] [http://isa.algopedia.ro/wiki/index.php/cautare Rez]&lt;br /&gt;
* [http://varena.ro/problema/medalion medalion] parcurgerea in spirala [http://isa.algopedia.ro/wiki/index.php/medalion Rez]&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=215 criptmat] parcurgerea in zigzag [http://isa.algopedia.ro/wiki/index.php/criptmat Rez]&lt;br /&gt;
* [http://varena.ro/problema/tinta tinta]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
criptare,  modifMat , Criptare ,   wisp,   Optional: decodificare , Iceberg&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_31&amp;diff=17788</id>
		<title>Clasa a XI-a lecția 31</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_31&amp;diff=17788"/>
		<updated>2020-05-15T09:02:06Z</updated>

		<summary type="html">&lt;p&gt;Bella: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== BFS - folosind vectorul de tati ==&lt;br /&gt;
* Determinarea inaltimii unui arbore&lt;br /&gt;
* Afisarea nodurilor in ordinea parcurgerii&lt;br /&gt;
&lt;br /&gt;
Pentru a parcurge in latime un graf pentru care stim vectorii de tati, vom proceda in felul urmator.&lt;br /&gt;
* Identificam nodul radacina in vectorul de tati (este nodul pentru care tatal este 0) ;&lt;br /&gt;
* Pornim pargurgerea grafului din nodul radacina si adaugam nodurile parcurse intr-o coada.&lt;br /&gt;
* In timp ce parcurgem nodurile putem marca nivelul pe care se gaseste fiecare nod, nodul radacina va fi marcat ca avand nivelul 1 in graf. &lt;br /&gt;
* Algoritmul de parcurgere va cauta pentru fiecare nod, descendentii acestuia in vectorul de tati cautare ce se realizeaza pentru un singur nod in O(n), respectiv pentru toate cele n noduri O(n^2). Pentru fiecare nod &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
Se citeste vectorul de tati asociat unui arbore cu radacina.&lt;br /&gt;
1. Afisati cate nivele are arborele?&lt;br /&gt;
2. Afisati nodurile arborelui parcurgand arborele in latime, pornind din nodul radacina&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;inaltime.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;inaltime.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int t[101];&lt;br /&gt;
int c[101], niv[101];         // in viz punem nivelul&lt;br /&gt;
int n;&lt;br /&gt;
void bfs( int r ){&lt;br /&gt;
  int p, u;&lt;br /&gt;
  p = u = 1;&lt;br /&gt;
  c[1] = r;                             // pun in coada radacina&lt;br /&gt;
  niv[1] = 1;                           // nivelul primului nod introdus este 1&lt;br /&gt;
  while( p &amp;lt;= u ){&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )       // parcurg vectorul de tati si caut nodurile pentru care c[p] e tata&lt;br /&gt;
      if( t[i] == c[p] ){               // daca i e descendent al lui c[p] = daca nodul i il are ca tata pe c[p]&lt;br /&gt;
        c[++u] = i;                     // il pun in coada&lt;br /&gt;
        niv[u] = niv[p] + 1;            // il marchez ca vizitat, i are nivelul lui nod + 1&lt;br /&gt;
      }&lt;br /&gt;
    p++;                              // trec la urm element din coada&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int i, r;&lt;br /&gt;
&lt;br /&gt;
  // citesc vectorul de tati si identific radacina&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; t[i];&lt;br /&gt;
    if( t[i] == 0 )&lt;br /&gt;
      r = i;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // parcurg graful in latime pornind din nodul radacina&lt;br /&gt;
  bfs( r );&lt;br /&gt;
  &lt;br /&gt;
  // nivelul ultimului element vizitat este chiar inaltimea arborelui&lt;br /&gt;
  fout &amp;lt;&amp;lt; niv[n] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;       &lt;br /&gt;
  &lt;br /&gt;
  // afisez nodurile memorate in vectorul coada, in ordinea parcurgerii&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    fout &amp;lt;&amp;lt; c[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== DFS - folosind vectorul de tati ==&lt;br /&gt;
Pentru a determina inaltimea unui graf, putem de asemenea sa parcurgem graful in adancime si sa marcam nivelul unui nod ca fiind nivelul cu 1 mai mult decat ascendentul lui.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;inaltime.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;inaltime.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int t[101];&lt;br /&gt;
int niv[101];         // in viz punem nivelul&lt;br /&gt;
int n, nivmax;&lt;br /&gt;
void dfs( int r ){&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    if( t[i] == r ){       // daca daca r e tatal lui i&lt;br /&gt;
      niv[i] = niv[r] + 1;&lt;br /&gt;
      if (niv[i] &amp;gt; nivmax )&lt;br /&gt;
        nivmax = niv[i];&lt;br /&gt;
      dfs(i);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int i, r;&lt;br /&gt;
&lt;br /&gt;
  // citesc vectorul de tati si identific radacina&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; t[i];&lt;br /&gt;
    if( t[i] == 0 )&lt;br /&gt;
      r = i;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // parcurg graful in adancime pornind din nodul radacina&lt;br /&gt;
&lt;br /&gt;
  niv[r] = 1;&lt;br /&gt;
  dfs( r );&lt;br /&gt;
&lt;br /&gt;
  // nivelul maxim atins in parcurgerea dfs&lt;br /&gt;
  fout &amp;lt;&amp;lt; nivmax &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Aplicatii =&lt;br /&gt;
==[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=636 Arbore] ==	&lt;br /&gt;
Se dau cele n-1 muchii ale unui arbore cu n noduri și un nod k . Afișați vectorul de tați al arborelui cu rădăcina în k.&lt;br /&gt;
=== Parcurgere cu DFS ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Parcurgem in agancime arborele si marcam pentru fiecare nod tatal intr-un vector de tati&lt;br /&gt;
// Nodul radacina va avea 0 ca tata.&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;arbore.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;arbore.out&amp;quot; );&lt;br /&gt;
int a[101][101];&lt;br /&gt;
int t[101],viz[101];&lt;br /&gt;
int n, k;&lt;br /&gt;
void dfs( int k ){&lt;br /&gt;
  viz[k] = 1;&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    if( a[k][i] == 1 &amp;amp;&amp;amp; !viz[i] ){&lt;br /&gt;
      t[i] = k;&lt;br /&gt;
      dfs(i);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  int i, x, y;&lt;br /&gt;
  fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;&lt;br /&gt;
  for( i = 1; i &amp;lt;= n - 1; i++ ){  // citim cele n-1 muchii&lt;br /&gt;
    fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;&lt;br /&gt;
    a[x][y] = a[y][x] = 1;        // le marcam in matricea de adiacenta&lt;br /&gt;
  }&lt;br /&gt;
  dfs(k);                         // parcurgem in adancime graful si marcam pentru fiecare nod tatal&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ )       // afisam vectorul de tati&lt;br /&gt;
    fout &amp;lt;&amp;lt; t[i] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
  &lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgere cu BFS ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Parcurgem in latime arborele si marcam pentru fiecare nod tatal intr-un vector de tati&lt;br /&gt;
// Nodul radacina va vea 0 ca tata.&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin(&amp;quot;arbore.in&amp;quot;);&lt;br /&gt;
ofstream fout(&amp;quot;arbore.out&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
int A[101][101],viz[101],c[101], t[101];&lt;br /&gt;
int n,k;&lt;br /&gt;
void bfs( int r ){&lt;br /&gt;
  int p, u, nod;&lt;br /&gt;
  p = u = 0;&lt;br /&gt;
  c[p] = r;&lt;br /&gt;
  viz[r] = 1;&lt;br /&gt;
  while( p &amp;lt;= u ){&lt;br /&gt;
    nod = c[p];  // nodul pentru care pun&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )     // parcurg linia nod&lt;br /&gt;
      if( A[nod][i] == 1 &amp;amp;&amp;amp; !viz[i] ){// daca i e vecin cu nod&lt;br /&gt;
        c[++u] = i;                   // il pun in coada&lt;br /&gt;
        viz[nod] = 1;                 // il marchez ca vizitat&lt;br /&gt;
        t[i] = nod;                   // tatal nodului i este nod&lt;br /&gt;
      }&lt;br /&gt;
    p++;                              // trec la urm element din coada&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int x, y;&lt;br /&gt;
    fin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;&lt;br /&gt;
    t[k] = 0;&lt;br /&gt;
    for( int i = 1; i &amp;lt; n; i++ ){&lt;br /&gt;
        fin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; y;&lt;br /&gt;
        A[x][y] = A[y][x] = 1;&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    bfs( k );&lt;br /&gt;
    for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
      fout &amp;lt;&amp;lt; t[i] &amp;lt;&amp;lt;&amp;quot; &amp;quot;;&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=639 Inaltime] ==&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri. Determinați înălțimea arborelui.&lt;br /&gt;
=== DFS - folosind vectorul de tati ===&lt;br /&gt;
Pentru a determina inaltimea unui graf, putem de asemenea sa parcurgem graful in adancime si sa marcam nivelul unui nod ca fiind nivelul cu 1 mai mult decat ascendentul lui.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;inaltime.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;inaltime.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int t[101];&lt;br /&gt;
int niv[101];         // in viz punem nivelul&lt;br /&gt;
int n, nivmax;&lt;br /&gt;
void dfs( int r ){&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    if( t[i] == r ){       // daca daca r e tatal lui i&lt;br /&gt;
      niv[i] = niv[r] + 1;&lt;br /&gt;
      if (niv[i] &amp;gt; nivmax )&lt;br /&gt;
        nivmax = niv[i];&lt;br /&gt;
      dfs(i);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int i, r;&lt;br /&gt;
&lt;br /&gt;
  // citesc vectorul de tati si identific radacina&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; t[i];&lt;br /&gt;
    if( t[i] == 0 )&lt;br /&gt;
      r = i;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // parcurg graful in adancime pornind din nodul radacina&lt;br /&gt;
&lt;br /&gt;
  niv[r] = 1;&lt;br /&gt;
  dfs( r );&lt;br /&gt;
&lt;br /&gt;
  // nivelul maxim atins in parcurgerea dfs&lt;br /&gt;
  fout &amp;lt;&amp;lt; nivmax &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=652 AfisareFii] ==&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri și k noduri distincte din arbore. Afișați fiii fiecăruia dintre cele k noduri.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;afisarefii.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;afisarefii.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int t[101];&lt;br /&gt;
int f[101];&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, i, k, j, x;&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; t[i];&lt;br /&gt;
    f[t[i]] ++;            // numar in f cate noduri au ca tata pe t[i]&lt;br /&gt;
  }&lt;br /&gt;
  fin &amp;gt;&amp;gt; k;&lt;br /&gt;
  for( i = 1; i &amp;lt;= k; i++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; x;&lt;br /&gt;
    fout &amp;lt;&amp;lt; f[x] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    for( j = 1; j &amp;lt;= n; j++ ) // afisam nodurile care il au ca tata pe x&lt;br /&gt;
      if( t[j] == x )&lt;br /&gt;
        fout &amp;lt;&amp;lt; j &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; endl;&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://www.pbinfo.ro/probleme/637/frunze Frunze] ==&lt;br /&gt;
&lt;br /&gt;
Cerința : Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri. Determinați rădăcina arborelui și frunzele acestuia.&lt;br /&gt;
Date de intrare: Fișierul de intrare frunze.in conține pe prima linie numărul de noduri n. Pe linia următoare se află vectorul de tați al arborelui, valorile fiind separate prin spații.&lt;br /&gt;
Date de ieșire: Fișierul de ieșire frunze.out va conține pe prima linie rădăcina arborelui. A doua linia va conține numărul de frunze din arbore, iar următoarea linie frunzele, în ordine crescătoare și separate printr-un spațiu.&lt;br /&gt;
Restricții și precizări&lt;br /&gt;
1 ≤ n ≤ 100&lt;br /&gt;
în vectorul de tați rădăcina este marcată cu 0&lt;br /&gt;
&lt;br /&gt;
Exemplu&lt;br /&gt;
frunze.in&lt;br /&gt;
7&lt;br /&gt;
4 1 7 0 7 7 1 &lt;br /&gt;
frunze.out&lt;br /&gt;
4&lt;br /&gt;
4&lt;br /&gt;
2 3 5 6&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;fstream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
ifstream fin( &amp;quot;frunze.in&amp;quot; );&lt;br /&gt;
ofstream fout( &amp;quot;frunze.out&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int t[101];&lt;br /&gt;
int f[101];&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, i;&lt;br /&gt;
&lt;br /&gt;
  fin &amp;gt;&amp;gt; n;&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ ){&lt;br /&gt;
    fin &amp;gt;&amp;gt; t[i];&lt;br /&gt;
    f[t[i]] ++;            // numar in f cate noduri au ca tata pe t[i]&lt;br /&gt;
    if( t[i] == 0 )        // daca i e radacina arborelui&lt;br /&gt;
      fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;   // il afisez&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  int frunze = 0;          // numar frunzele arborelul&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
      if( f[i] == 0 )      // i e frunza daca nu apare ca tata la niciun nod&lt;br /&gt;
        frunze ++;&lt;br /&gt;
  fout &amp;lt;&amp;lt; frunze &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  for( i = 1; i &amp;lt;= n; i++ )// afisez toate nodurile frunza&lt;br /&gt;
    if( f[i] == 0 )&lt;br /&gt;
      fout &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
    fout &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tema Teorie = &lt;br /&gt;
==[https://www.pbinfo.ro/probleme/650/knivel kNivel]==	&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri și o valoare k. Determinați nodurile situate pe nivelul k în arbore.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==[https://www.pbinfo.ro/probleme/640/nrfii NrFii]==	&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri. Determinați nodul din arbore cu număr maxim de fii. Dacă în arbore sunt mai multe noduri cu număr maxim de fii, afișați-le pe toate, în ordine crescătoare.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==[https://www.pbinfo.ro/probleme/641/subarbore Subarbore] ==	&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri și un nod k. Afișați, în ordine crescătoare, nodurile din subarborele cu rădăcina în k.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==[https://www.pbinfo.ro/probleme/648/subarborenumarare SubarboreNumarare]==	&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri și un nod k. Determinați câte noduri conține subarborele cu rădăcina în k.&lt;br /&gt;
&lt;br /&gt;
= Laborator =&lt;br /&gt;
== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=638 Nivele] ==&lt;br /&gt;
Se dă vectorul de tați al unui arbore cu rădăcină cu n noduri și k noduri din arbore. Determinați pentru fiecare dintre cele k noduri nivelul pe care se află.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=2749 tata]	==&lt;br /&gt;
Se dă un vector t=(t[1], t[2], ..., t[n]) care memorează numere naturale cuprinse între  0 și n. Să se verifice dacă t este sau nu vector de tați asociat unui arbore cu rădăcină.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_29&amp;diff=17784</id>
		<title>Clasa a IX-a lecția 29</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_29&amp;diff=17784"/>
		<updated>2020-05-12T13:04:00Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Tema Laborator */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Lectie ( TEORIE ) =&lt;br /&gt;
== Matrice ==&lt;br /&gt;
Matricele sînt asemănătoare cu vectorii, dar cu două dimensiuni (coordonate, poziții) în loc de una. Vectorii se mai numesc și tablouri unidimensionale, iar matricele se mai numesc și tablouri bidimensionale.&lt;br /&gt;
=== Declarare matrice ===&lt;br /&gt;
Matricele se declară similar cu vectorii, însă cu o dimensiune în plus:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;int a[100][500];&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Primul număr, &amp;lt;tt&amp;gt;100&amp;lt;/tt&amp;gt; în cazul nostru, reprezintă numărul de linii al matricei &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;. Al doilea număr, &amp;lt;tt&amp;gt;500&amp;lt;/tt&amp;gt; în exemplul de mai sus, reprezintă numărul de coloane al matricei &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt;, sau numărul de elemente al fiecărei linii. O matrice poate fi privită ca un vector de vectori. În exemplul de mai sus &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; poate fi privită ca un vector de &amp;lt;tt&amp;gt;100&amp;lt;/tt&amp;gt; de elemente. Fiecare element al acestui vector este, la rîndul lui, un alt vector, de &amp;lt;tt&amp;gt;500&amp;lt;/tt&amp;gt; de elemente. Numărul total de elemente al matricei &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; este &amp;lt;tt&amp;gt;100&amp;lt;/tt&amp;gt; x &amp;lt;tt&amp;gt;500&amp;lt;/tt&amp;gt;, adică &amp;lt;tt&amp;gt;50000&amp;lt;/tt&amp;gt; de elemente întregi.&lt;br /&gt;
&lt;br /&gt;
=== Citire matrice ===&lt;br /&gt;
Cum citim o matrice? Asemănător cu un vector, vom citi mai întîi numărul de linii și numărul de coloane, apoi elementele. Elementele se citesc, în general, de-a lungul liniilor, fiecare linie fiind citită ca un vector:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;fscanf( fin, &amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;m );&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
  for ( j = 0; j &amp;lt; m; j++ )&lt;br /&gt;
    fscanf( fin, &amp;quot;%d&amp;quot;, &amp;amp;a[i][j] );&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Scriere matrice ===&lt;br /&gt;
Scrierea este asemănătoare cu citirea, cu mențiunea să avem grijă să tipărim un &amp;lt;tt&amp;gt;&#039;\n&#039;&amp;lt;/tt&amp;gt; la finalul fiecărei linii. Vom afisa linie cu linie, pentru fiecare linie, afisam elementele de pe acea linie si un sfarsit de linie.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ ) {&lt;br /&gt;
  for ( j = 0; j &amp;lt; m; j++ )&lt;br /&gt;
    fprintf( fout, &amp;quot;%d &amp;quot;, a[i][j] );&lt;br /&gt;
  fprintf( fout, &amp;quot;\n&amp;quot; );&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parcurgerea elementelor unei matrice ===&lt;br /&gt;
In functie de cerintele problemei, parcurgerea elementelor matricei, in vederea prelucrarii acestora, poate fi facuta in mai multe modalitati. Cea mai intalnita metoda de a parcurge elementele unei matrice, este parcurgerea linie cu line. Sa presupunem ca ni se cere sa calculam suma elementelor tuturor elementelor. Iata allgoritmul: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
s = 0;&lt;br /&gt;
for ( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
  for ( j = 0; j &amp;lt; m; j++ )&lt;br /&gt;
    s += a[i][j];&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Un algoritm echivalent este acela de a parcurge matricea coloane cu coloana:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
s = 0;&lt;br /&gt;
for ( j = 0; j &amp;lt; m; j++ )&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ ) &lt;br /&gt;
    s += a[i][j];&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Din punct de vedere al eficientei, credeti ca este vreo deosebire intre cei doi algoritmi?&lt;br /&gt;
&lt;br /&gt;
=== Căutare element în matrice ===&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;i = j = 0;&lt;br /&gt;
while ( (i &amp;lt; n) &amp;amp;&amp;amp; (a[i][j] != e) ) {&lt;br /&gt;
  j++;&lt;br /&gt;
  if ( j &amp;gt;= m ) {&lt;br /&gt;
    j = 0;&lt;br /&gt;
    i++;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
if ( i == n )&lt;br /&gt;
  //nu am gasit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Permutarea coloanelor spre stanga ===&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se permute coloanele matricei circular spre stânga cu o poziție. [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=770 PermCol]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
int a[100][100];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, m, i, j, aux;&lt;br /&gt;
  scanf ( &amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;m );&lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    for ( j = 0; j &amp;lt; m; j++ )&lt;br /&gt;
      scanf ( &amp;quot;%d&amp;quot;, &amp;amp;a[i][j] );      &lt;br /&gt;
  &lt;br /&gt;
  for ( i = 0; i &amp;lt; n; i++ ){&lt;br /&gt;
      // permutam spre stanga linia i&lt;br /&gt;
      aux = a[i][0];                // primul element de pe linia i il salvam in aux&lt;br /&gt;
      for ( j = 0; j &amp;lt; m - 1; j++ ) // mutam spre dreapta toate celelalte elem de pe linie, incepand cu al doilea elem&lt;br /&gt;
        a[i][j]= a[i][j+1];&lt;br /&gt;
      a[i][m-1] = aux;              // punem elementul salvat in aux pe ultima pozitie a liniei i&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for ( i = 0 ; i &amp;lt; n ; i++ ){&lt;br /&gt;
    for ( j = 0 ; j &amp;lt; m ; j++ )&lt;br /&gt;
      printf ( &amp;quot;%d &amp;quot;, a[i][j] );      &lt;br /&gt;
    printf ( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LABORATOR ==&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=659 SumaLinii1]	====&lt;br /&gt;
Gigel a găsit o matrice cu n linii și m coloane și elemente numere naturale. El își propune să determine, pentru fiecare linie, cea mai mică valoare care se poate obține adunând elementele de pe linie, cu excepția unuia.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a[101][101];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
    int n, m, s, c, l, max;&lt;br /&gt;
    &lt;br /&gt;
    scanf ( &amp;quot;%d %d&amp;quot;, &amp;amp;n, &amp;amp;m);&lt;br /&gt;
    &lt;br /&gt;
    for ( l = 0 ; l &amp;lt; n ; l++ ){&lt;br /&gt;
        s = 0;&lt;br /&gt;
        max = a[l][0];&lt;br /&gt;
        for ( c = 0 ; c &amp;lt; m ; c++ ){&lt;br /&gt;
            scanf ( &amp;quot;%d&amp;quot;, &amp;amp;a[l][c] );&lt;br /&gt;
            s = s + a[l][c];&lt;br /&gt;
            if ( a[l][c] &amp;gt; max ){&lt;br /&gt;
                max = a[l][c];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        s  =  s - max;&lt;br /&gt;
        printf ( &amp;quot;%d &amp;quot;, s);&lt;br /&gt;
    }&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=773 MaxAp1]====	&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine elementul cu număr maxim de apariții în matrice. Dacă există mai multe elemente cu număr maxim de apariții se va afișa cel mai mare dintre ele.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int v[1000000]; //vectorul de frecventa&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, m, i, j, x, maxap;&lt;br /&gt;
  scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;m, &amp;amp;n );&lt;br /&gt;
  for( i = 0; i &amp;lt; m; i++ ){&lt;br /&gt;
    for( j = 0; j &amp;lt; n; j++ ){&lt;br /&gt;
      scanf( &amp;quot;%d&amp;quot;, &amp;amp;x );&lt;br /&gt;
      v[x]++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  int val;&lt;br /&gt;
  maxap = 0;&lt;br /&gt;
  for( i = 0; i &amp;lt; 1000000; i++ )&lt;br /&gt;
    if( v[i] &amp;gt;= maxap ){&lt;br /&gt;
      maxap = v[i];&lt;br /&gt;
      val = i;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  printf(&amp;quot;%d&amp;quot;, val);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=771 OrdLin] ====	&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se ordoneze liniile matricei crescător după suma elementelor.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int a[101][101];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, m, i, j, x, minim, poz;&lt;br /&gt;
&lt;br /&gt;
  // citim matricea si calculam suma pe fiecare linie, memorand sumele pe ultima coloana&lt;br /&gt;
  scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;m, &amp;amp;n );&lt;br /&gt;
  for( i = 0;i &amp;lt; m; i++ ){&lt;br /&gt;
    a[i][n] = 0;       // aici voi pune suma elementelor de pe linia i&lt;br /&gt;
    for( j = 0; j &amp;lt; n; j++ ){&lt;br /&gt;
      scanf( &amp;quot;%d&amp;quot;, &amp;amp;a[i][j] );&lt;br /&gt;
      a[i][n] += a[i][j];&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // sortam liniile dupa elementele de pe coloana n cu metoda select sort&lt;br /&gt;
  for( i = 0; i &amp;lt; m - 1; i++ ){&lt;br /&gt;
    // determinam minimul si pozitia minimului pe coloana n, incepand de la linia i&lt;br /&gt;
    minim = a[i][n]; poz = i;&lt;br /&gt;
    for( j = i + 1; j &amp;lt; m; j++ )&lt;br /&gt;
      if( a[j][n] &amp;lt; minim ){&lt;br /&gt;
        minim = a[j][n];&lt;br /&gt;
        poz = j;&lt;br /&gt;
      }&lt;br /&gt;
    // interschimb  linia i cu linia poz ( inclusiv a[i][n] cu a[poz][n])&lt;br /&gt;
    int aux;&lt;br /&gt;
    for( x = 0; x &amp;lt;= n; x++ ){&lt;br /&gt;
      aux = a[poz][x];&lt;br /&gt;
      a[poz][x] = a[i][x];&lt;br /&gt;
      a[i][x] = aux;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // afisam matricea &lt;br /&gt;
  for( i = 0; i &amp;lt; m; i++ ){&lt;br /&gt;
    for( j = 0; j &amp;lt; n; j++ )&lt;br /&gt;
      printf( &amp;quot;%d &amp;quot;, a[i][j] );&lt;br /&gt;
    printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=778 MChenar] ====&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine mulțimea formată din elementele distincte ale chenarului matricei.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
int v[1000000]; //vectorul de frecventa&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int n, m, i, j, x;&lt;br /&gt;
  scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;m, &amp;amp;n );&lt;br /&gt;
  for( i = 0; i &amp;lt; m; i++ ){&lt;br /&gt;
    for( j = 0; j &amp;lt; n; j++ ){&lt;br /&gt;
      scanf( &amp;quot;%d&amp;quot;, &amp;amp;x );&lt;br /&gt;
      if ( i == 0 || j == 0 || i == m - 1 || j == n - 1 )&lt;br /&gt;
        v[x]++;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  for(i = 0; i &amp;lt; 1000000; i++ ){&lt;br /&gt;
    if( v[i] &amp;gt; 0 )&lt;br /&gt;
      printf(&amp;quot;%d &amp;quot;, i );&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=804 ColEgale] ====	&lt;br /&gt;
Se dă o matrice cu m linii şi n coloane şi elemente numere naturale cu cel mult 4 cifre fiecare. Să se determine coloanele matricei care au toate elementele egale cu aceeași valoare.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a[50][50];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int i, j, n, m, cnt;&lt;br /&gt;
  scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;m);&lt;br /&gt;
  for( i = 0; i &amp;lt; n; i++ )&lt;br /&gt;
    for( j = 0; j &amp;lt; m; j++ )&lt;br /&gt;
      scanf( &amp;quot;%d&amp;quot;, &amp;amp;a[i][j] );&lt;br /&gt;
&lt;br /&gt;
  cnt = 0;&lt;br /&gt;
  for( j = 0; j &amp;lt; m; j++ ){&lt;br /&gt;
    // cautam pe coloana j un element diferit de primul element al coloanei j&lt;br /&gt;
    i = 1;&lt;br /&gt;
    while( i &amp;lt; n &amp;amp;&amp;amp; a[i][j] == a[0][j] )&lt;br /&gt;
      i++;&lt;br /&gt;
    // daca nu am gasit un element diferit printam valoarea comuna&lt;br /&gt;
    if ( i == n ){&lt;br /&gt;
      cnt ++;&lt;br /&gt;
      printf(&amp;quot;%d &amp;quot;, a[0][j]);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  if (!cnt)&lt;br /&gt;
    printf(&amp;quot;nu exista&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=751 MCautare] ====	&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente numere naturale și k valori naturale. Determinați pentru fiecare dintre cele k valori dacă apare pe fiecare linie a matricei.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int a[100][100];&lt;br /&gt;
&lt;br /&gt;
int main(){&lt;br /&gt;
  int i, j, n, m, nr, x, cnt, k;&lt;br /&gt;
&lt;br /&gt;
  scanf( &amp;quot;%d%d&amp;quot;, &amp;amp;m, &amp;amp;n );&lt;br /&gt;
  for( i = 0; i &amp;lt; m; i++ )&lt;br /&gt;
    for( j = 0; j &amp;lt; n; j++ )&lt;br /&gt;
      scanf( &amp;quot;%d&amp;quot;, &amp;amp;a[i][j] );&lt;br /&gt;
&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;nr );&lt;br /&gt;
  for( k = 0; k &amp;lt; nr; k++ ){&lt;br /&gt;
    scanf( &amp;quot;%d&amp;quot;, &amp;amp;x );&lt;br /&gt;
    // numaram pe cate linii apare x&lt;br /&gt;
    cnt = 0;&lt;br /&gt;
    for ( i = 0; i &amp;lt; m; i++ ){&lt;br /&gt;
      j = 0;&lt;br /&gt;
      while ( j &amp;lt; n  &amp;amp;&amp;amp; a[i][j] != x  )&lt;br /&gt;
        j++;&lt;br /&gt;
      cnt = cnt + ( j &amp;lt; n );&lt;br /&gt;
    }&lt;br /&gt;
    // daca x apare pe toate liniile afisam DA altfel afisam NU&lt;br /&gt;
    if ( cnt == m )&lt;br /&gt;
      printf(&amp;quot;DA\n&amp;quot;);&lt;br /&gt;
    else&lt;br /&gt;
      printf(&amp;quot;NU\n&amp;quot;);&lt;br /&gt;
  }&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
_________________________________________________________________________________________________________________________&lt;br /&gt;
&lt;br /&gt;
==== Citirea unei matrice de caractere fara sa se citeasca in prealabil dimensiunea ei ====&lt;br /&gt;
Sa se citeasca din fisierul &amp;quot;date.in&amp;quot; o matrice de caractere. Fiecare linie de caractere este pe cate un rand al fisierului, iar caracterele nu au spatii intre ele. D&lt;br /&gt;
Vom citi prima linie a fisierului si vom determina numarul de elemente de pe aceasta, determinand astfel numarul de coloane ale matricei n. Apoi vom citi urmatoarele linii pana la intalnirea sfarsitului de fisier.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Sol 9 C&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char a[100][100];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin, *fout;&lt;br /&gt;
  int n, m, l, c;&lt;br /&gt;
  char ch;&lt;br /&gt;
&lt;br /&gt;
  fin = fopen( &amp;quot;date.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  // citim intii prima linie pina la &#039;\n&#039;, pentru a-l afla pe n=nr. de coloane&lt;br /&gt;
  n = 0;&lt;br /&gt;
  ch = fgetc( fin );&lt;br /&gt;
  while ( ch != &#039;\n&#039; ) {&lt;br /&gt;
    a[0][n] = ch;&lt;br /&gt;
    n++;&lt;br /&gt;
    ch = fgetc( fin );&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  // citim linie cu linie pana ajungem la o linie goala sau la finalul fisierului(EOF)&lt;br /&gt;
  ch = fgetc( fin );&lt;br /&gt;
  m = 1; // nr. de linii&lt;br /&gt;
  while ( ch != &#039;\n&#039; &amp;amp;&amp;amp; ch != EOF ) {&lt;br /&gt;
    // Fisierul nu s-a terminat, citim urmatoarea linie:&lt;br /&gt;
    for ( c = 0; c &amp;lt; n; c++ ) {&lt;br /&gt;
      a[m][c] = ch;&lt;br /&gt;
      ch = fgetc( fin );&lt;br /&gt;
    }&lt;br /&gt;
    m++;&lt;br /&gt;
    ch = fgetc( fin );&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Afisam matricea&lt;br /&gt;
  fout = fopen( &amp;quot;date.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  for ( l = 0; l &amp;lt; m; l++ ) {&lt;br /&gt;
    for ( c = 0; c &amp;lt; n; c++ )&lt;br /&gt;
      fputc( a[l][c], fout );&lt;br /&gt;
    fputc( &#039;\n&#039;, fout );&lt;br /&gt;
  }&lt;br /&gt;
  fclose( fout );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
O implementare similara a solutiei de mai sus presupune citirea tuturor caracterelor pana la sfarsit de fisier. Vom numara elementele pana la intalnirea primului sfarsit de linie, determinand astfel numarul de coloane si vom numara &#039;\n&#039;-rile determinand astfel numarul de linii. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
//Sol 9I&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char a[100][100];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin, *fout;&lt;br /&gt;
  int n, m, l, c,i;&lt;br /&gt;
  char ch;&lt;br /&gt;
&lt;br /&gt;
  fin = fopen( &amp;quot;date.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  // citim intii prima linie pina la &#039;\n&#039;, pentru a-l afla pe n=nr. de coloane&lt;br /&gt;
  i = m = n =  0;//m = nr de linii, m = linii de coloane&lt;br /&gt;
  ch = fgetc( fin );&lt;br /&gt;
  while (ch != EOF ) {&lt;br /&gt;
    if(ch == &#039;\n&#039;){&lt;br /&gt;
        if(m == 0)&lt;br /&gt;
            n = i;&lt;br /&gt;
        m++;&lt;br /&gt;
        i = 0;&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        a[m][i] = ch;&lt;br /&gt;
        i++;&lt;br /&gt;
    }&lt;br /&gt;
    ch = fgetc(fin);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Afisam matricea&lt;br /&gt;
  fout = fopen( &amp;quot;date.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  for ( l = 0; l &amp;lt; m; l++ ) {&lt;br /&gt;
    for ( c = 0; c &amp;lt; n; c++ )&lt;br /&gt;
      fputc( a[l][c], fout );&lt;br /&gt;
    fputc( &#039;\n&#039;, fout );&lt;br /&gt;
  }&lt;br /&gt;
  fclose( fout );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
O alta solutie ar fi sa retinem toate elementele intr-un vector, determinand numarul de linii in functie de numarul de &#039;\n&#039; uri, iar numarul de coloane il putem determina pe baza numarului de linii si al numarului total de elemente trasnferate in vector. La final vom afisa elementele vectorului sub forma unei matrice, tiparind cate n elemente pe fiecare rand.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
char a[100*100];&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  FILE *fin, *fout;&lt;br /&gt;
  int n, m, l, c, j;&lt;br /&gt;
  char ch;&lt;br /&gt;
&lt;br /&gt;
  fin = fopen( &amp;quot;date.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
  // Construim un vector cu toate elementele matricei&lt;br /&gt;
  m = j = 0;        //m = nr de linii, j = numarul de elemente citite&lt;br /&gt;
  ch = fgetc( fin );&lt;br /&gt;
  while (ch != EOF ) {&lt;br /&gt;
    if( ch == &#039;\n&#039; )&lt;br /&gt;
        m++;&lt;br /&gt;
    else&lt;br /&gt;
        a[j++] = ch;&lt;br /&gt;
    ch = fgetc(fin);&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  n = j / m;        // n = nr de coloane = nr de elemente citite / nr de linii&lt;br /&gt;
  &lt;br /&gt;
  // Afisam matricea&lt;br /&gt;
  fout = fopen( &amp;quot;date.out&amp;quot;, &amp;quot;w&amp;quot; );&lt;br /&gt;
  for ( l = 0; l &amp;lt; m; l++ ) {&lt;br /&gt;
    for ( c = 0; c &amp;lt; n; c++ )&lt;br /&gt;
      fputc( a[l*n+c], fout );&lt;br /&gt;
    fputc( &#039;\n&#039;, fout );&lt;br /&gt;
  }&lt;br /&gt;
  fclose( fout );&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Sarcina Laborator:&#039;&#039;&#039;&lt;br /&gt;
* Cititi o matrice de numere naturale fara sa se cunoasca dimensiunea acestea&lt;br /&gt;
* Cititi o matrice de numere intregi fara sa se cunoasca dimensiunea acesteia&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
== Tema Teorie ==&lt;br /&gt;
Rezolvati urmatoarele probleme de pe pbinfo.ro&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=767 SumaPare2]	====&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Determinați suma valorilor pare din matrice.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=658 SumaLinii]	====&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente numere naturale. Să se determine suma elementelor de pe fiecare linie.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=666 NrPrime] ====&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente numere naturale. Să se determine câte dintre elementele situate pe linii cu indici pari sunt prime.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=768 SumaPare3] ==== 	&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Determinați suma valorilor pare distincte din matrice. Dacă o valoare pară apare în matrice de mai multe ori, se va aduna o singură dată.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=771 MaxAp] ==== &lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine elementul cu număr maxim de apariții în matrice. Dacă există mai multe elemente cu număr maxim de apariții se vor afișa toate, în ordine crescătoare.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Tema Laborator pbinfo ==&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=789  Max2Ap] ==== &lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine cea mai mare valoare care apare în matrice de cel puțin două ori.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=776 CntLinii] ====	&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine câte linii ale matricei au toate elementele egale.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=777 CntColoane] ====	&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se determine câte coloane ale matricei au elementele distincte două câte două.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=769 OrdCol] ==== 	&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Să se ordoneze coloanele matricei astfel încât elementele de pe prima linie să fie ordonate crescător.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=662 SumElPare] ====	&lt;br /&gt;
Se dă o matrice cu n linii și m coloane și elemente numere naturale. Să se determine indicele liniei pentru care suma elementelor pare este maximă.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=766 NrPare] ==== 	&lt;br /&gt;
Se dă o matrice cu n linii şi m coloane şi elemente numere naturale. Determinați indicele liniei care conține număr maxim de elemente pare. Dacă există mai multe linii cu număr maxim de elemente pare, se vor afișa toți indicii, în ordine crescătoare.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====[https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1007 Matrice7] ====	&lt;br /&gt;
Se consideră o matrice cu n linii şi m coloane şi elemente numere naturale. Să se modifice matricea în felul următor: toate elementele egale cu valoarea maximă din matrice se înlocuiesc cu valoarea minimă de pe coloana lor.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Probleme de pe varena ==&lt;br /&gt;
* [http://varena.ro/problema/zoomx2 zoomx2] - generare matrice pe baza unei matrice date&lt;br /&gt;
* [http://varena.ro/problema/cautare căutare] - cautare submatrice in matrice&lt;br /&gt;
* [http://varena.ro/problema/patrate1 patrate1]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_30&amp;diff=17642</id>
		<title>Clasa a IX-a lecția 30</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_30&amp;diff=17642"/>
		<updated>2020-04-04T16:25:00Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_28&amp;diff=17640</id>
		<title>Clasa a IX-a lecția 28</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_28&amp;diff=17640"/>
		<updated>2020-04-04T15:52:47Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_27&amp;diff=17571</id>
		<title>Clasa a XI-a lecția 27</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_27&amp;diff=17571"/>
		<updated>2020-03-25T10:07:14Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* TEMA REZOLVARI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Algoritmul lui Dijkstra =&lt;br /&gt;
Este un algoritm care &#039;&#039;&#039;calculeaza drumurile minime de la un nod al unui graf la toate celelalte noduri din graf&#039;&#039;&#039;.&lt;br /&gt;
Grafurile pe care poate lucra algoritmul lui Dijkstra sunt, in general:&lt;br /&gt;
* orientate&lt;br /&gt;
* ponderate&lt;br /&gt;
* conexe sau neconexe&lt;br /&gt;
Desigur ca algoritmul functioneaza si pe grafuri:&lt;br /&gt;
* neorientate, graful neorientat fiind o particularitate a grafului orientat. &lt;br /&gt;
* neponderate: daca graful este neponderat (arcele nu au costuri asociate) atunci drumul minim intre doua noduri se considera drumul alcatuit din numarul minim de arce. Putem transforma graful neponderat intr-un graf ponderat asociind fiecarui arc un cost egal cu 1.&lt;br /&gt;
Daca nu exista nici un drum de la nodul de start la un alt nod al grafului atunci algoritmul lui Dijkstra va raporta existenta unui drum de lungime infinita intre ele – acest rezultat indica, de fapt, lipsa oricarui drum intre cele doua noduri&lt;br /&gt;
&lt;br /&gt;
== Descriere algoritm ==&lt;br /&gt;
&#039;&#039;&#039;Intrare:&#039;&#039;&#039;&lt;br /&gt;
Se citeste un  graf orientat si ponderat cu N noduri si M arce si un nod de start apartinand grafului – acesta este nodul de la care se doreste aflarea drumurilor minime pana la celelalte noduri din graf.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Iesire:&#039;&#039;&#039;&lt;br /&gt;
Se vor afisa distantele minime de la nodul de start la toate celelalte noduri, distante pe care le vom memora intr-un vector &#039;&#039;&#039;D&#039;&#039;&#039; cu &#039;&#039;&#039;N&#039;&#039;&#039; intrari,&lt;br /&gt;
De asemenea, tot ca rezultat se poate obtine si arborele drumurilor minime (in cazul in care ne intereseaza nu numai lungimile minime ale drumurilor, ci si drumurile propriu-zise) – acesta este un arbore generalizat care se va obtine sub forma unui tablou T cu N intrari (implementarea cu indicatori spre parinte)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Descriere:&#039;&#039;&#039;&lt;br /&gt;
*Fie X nodul de start – acesta se marcheaza ca vizitat&lt;br /&gt;
Ideea gasirii drumului minim de la X la un un alt nod este cautarea treptata: se presupune ca drumul minim este alcatuit dintr-un singur arc (arcul direct intre X si nodul tinta, care poate sa nu existe, costul sau fiind infinit in acest caz), apoi se cauta drumuri mai scurte alcatuite din 2 arce, apoi din 3, etc. – un drum minim nu poate avea mai mult de N-1 arce, deci algoritmul are N-1 pasi (al N-lea este banal)&lt;br /&gt;
*Dupa pasul k (1 ≤ k ≤ N-1), tabloul D va contine lungimile drumurilor minime de la nodul X la celelalte noduri, toate aceste drumuri fiind alcatuite din maxim k arce&lt;br /&gt;
*Astfel, D[Y] = L dupa pasul k inseamna ca de la X la Y exista un drum minim de lungime L alcatuit din maxim k arce&lt;br /&gt;
*Deci, dupa pasul k, au fost gasite numai drumurile minime alcatuite din maxim k arce – abia la finalul algoritmului (dupa pasul N-1) drumurile minime obtinute sunt definitive, ele fiind drumuri minime alcatuite din maxim N-1 arce&lt;br /&gt;
&lt;br /&gt;
== Implementare  ==&lt;br /&gt;
=== Afisarea costurilor drumurilor minime ===&lt;br /&gt;
[https://www.infoarena.ro/problema/dijkstra  dijkstra infoarena]&lt;br /&gt;
==== Cu matrice de adiacenta - complexitate n*n ====&lt;br /&gt;
Complexitate O(n^2) memorie, timp&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const int maxn = 5001;     // nr maxim de noduri&lt;br /&gt;
const int inf = 1 &amp;lt;&amp;lt; 30;   // infinit&lt;br /&gt;
&lt;br /&gt;
FILE *fin = fopen( &amp;quot;dijkstra.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
FILE *fout = fopen( &amp;quot;dijkstra.out&amp;quot;,&amp;quot;w&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int n, m;&lt;br /&gt;
int d[maxn]; // costurile de la start la toate nodurile&lt;br /&gt;
int s[maxn]; // marchez nodurile selectate (nodurile pentru care am gasit deja drumul minim)&lt;br /&gt;
//int t[maxn]; // predecesorii fiecarui nod i in drumul de la nodul de start &lt;br /&gt;
int M[maxn][maxn];&lt;br /&gt;
&lt;br /&gt;
void read() {&lt;br /&gt;
  fscanf(fin, &amp;quot;%d %d&amp;quot;, &amp;amp;n, &amp;amp;m);&lt;br /&gt;
  for(int i = 1; i &amp;lt;= n; i++)&lt;br /&gt;
    for(int j = 1; j &amp;lt;= n; j++)&lt;br /&gt;
      M[i][j] = inf;&lt;br /&gt;
  int x, y, cost;&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= m; i++ ) {&lt;br /&gt;
    fscanf(fin, &amp;quot;%d %d %d&amp;quot;, &amp;amp;x, &amp;amp;y, &amp;amp;cost );  // citim arcul si costul asociat&lt;br /&gt;
    M[x][y] = cost;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void dijkstra( int start ) {  &lt;br /&gt;
  &lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ ) // initializam toate drumurile de la start la fiecare nod&lt;br /&gt;
    d[i] = inf;                   &lt;br /&gt;
  d[start] = 0;                  // dist de la start la el insusi e 0  &lt;br /&gt;
&lt;br /&gt;
  int min, pmin = 0;    // costul minim si nodul cu costul minim pana la start&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    &lt;br /&gt;
    min = inf;                   // determin nodul cel mai apropiat de nodul de start&lt;br /&gt;
    for ( int j = 1; j &amp;lt;= n; j++ )&lt;br /&gt;
      if ( d[j] &amp;lt; min &amp;amp;&amp;amp; !s[j] )&lt;br /&gt;
        min = d[j], pmin = j;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // parcurgem lista vecinilor nodului selectat pmin&lt;br /&gt;
    // pentru a vedea daca prin acest nod se ajunge mai repede la vecinii sai, pornind din start&lt;br /&gt;
    s[pmin] = 1;         // marcam ca si selectat nodul intermediar&lt;br /&gt;
    for(int i = 1; i &amp;lt;= n; i++){&lt;br /&gt;
      if ( d[i] &amp;gt; d[pmin] + M[pmin][i]){ // dc costul deja memorat al nodului nr_nod e mai mare decat costul prin nodul intermediar pmin&lt;br /&gt;
        d[i] = d[pmin] + M[pmin][i];      // actualizam costul in vectorul de costuri d&lt;br /&gt;
        //t[i] = pmin;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
  read();                     // citim muchiile si costurile acestora, construind listele de adiagenta&lt;br /&gt;
  int start = 1;              // fixam nodul de pornire 1&lt;br /&gt;
  dijkstra(start);            // calculam distantele de la nodul start la toate celelalte&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ )    // afisam dinstantele de la nodul start la fiecare nod&lt;br /&gt;
    if( i != start )&lt;br /&gt;
    fprintf(fout, &amp;quot;%d &amp;quot;, d[i] == inf ? 0 : d[i]);&lt;br /&gt;
  fprintf(fout, &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Cu liste de adiacenta ====&lt;br /&gt;
- complexitate de Timp (n^2), de memorie O(m) &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const int maxn = 50001;    // nr maxim de noduri&lt;br /&gt;
const int inf = 1 &amp;lt;&amp;lt; 30;   // infinit&lt;br /&gt;
&lt;br /&gt;
FILE *fin = fopen( &amp;quot;dijkstra.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
FILE *fout = fopen( &amp;quot;dijkstra.out&amp;quot;,&amp;quot;w&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
struct nod {&lt;br /&gt;
  int nr_nod, cost;&lt;br /&gt;
  nod *next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int n, m;&lt;br /&gt;
nod *L[maxn];&lt;br /&gt;
int d[maxn];   // costurile de la start la toate nodurile&lt;br /&gt;
int s[maxn];&lt;br /&gt;
&lt;br /&gt;
// adauga la lista lui x nodul cu numarul y&lt;br /&gt;
void add(int x, int y, int cost) {&lt;br /&gt;
  nod *c = new nod;&lt;br /&gt;
  c-&amp;gt;nr_nod = y;&lt;br /&gt;
  c-&amp;gt;cost = cost;&lt;br /&gt;
  c-&amp;gt;next = L[x];  // ne legam de primul nod al listei lui x&lt;br /&gt;
  L[x] = c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void read() {&lt;br /&gt;
  fscanf(fin, &amp;quot;%d %d&amp;quot;, &amp;amp;n, &amp;amp;m);&lt;br /&gt;
  int x, y, z;&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= m; i++ ) {&lt;br /&gt;
    fscanf(fin, &amp;quot;%d %d %d&amp;quot;, &amp;amp;x, &amp;amp;y, &amp;amp;z);  //citim arcul si costul asociat&lt;br /&gt;
    add(x, y, z);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void dijkstra( int start ) {&lt;br /&gt;
  // initializam toate drumurile de la start la fiecare nod&lt;br /&gt;
  // dist de la start la el insusi e 0&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    d[i] = inf;&lt;br /&gt;
  d[start] = 0;&lt;br /&gt;
  &lt;br /&gt;
  int min, pmin = 0;    // costul minim si nodul cu costul minim pana la start&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    // determin nodul cel mai apropiat de nodul de start&lt;br /&gt;
    min = inf;&lt;br /&gt;
    for ( int j = 1; j &amp;lt;= n; j++ )&lt;br /&gt;
      if ( d[j] &amp;lt; min &amp;amp;&amp;amp; !s[j] )&lt;br /&gt;
        min = d[j], pmin = j;&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    // parcurgem lista vecinilor nodului selectat pmin&lt;br /&gt;
    // pentru a vedea daca prin acest nod se ajunge mai repede la vecinii sai, pornind din start&lt;br /&gt;
    s[pmin] = 1;         // marcam ca si selectat nodul intermediar&lt;br /&gt;
    nod *t = L[pmin];&lt;br /&gt;
    while ( t ) {&lt;br /&gt;
      if ( d[ t-&amp;gt;nr_nod ] &amp;gt; d[pmin] + t-&amp;gt;cost )  // dc costul deja memorat al nodului nr_nod e mai mare decat costul prin nodul intermediar pmin&lt;br /&gt;
        d[ t-&amp;gt;nr_nod ] = d[pmin] + t-&amp;gt;cost;      // actualizam costul in vectorul de costuri d&lt;br /&gt;
      t = t-&amp;gt;next;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
  read();             // citim muchiile si costurile acestora, construind listele de adiagenta&lt;br /&gt;
  int start = 1;      // fixam nodul de pornire 1&lt;br /&gt;
  dijkstra(start);    // calculam distantele de la nodul start la toate celelalte&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ )    // afisam dinstantele de la nodul start la fiecare nod&lt;br /&gt;
    if( i != start )&lt;br /&gt;
    fprintf(fout, &amp;quot;%d &amp;quot;, d[i] == inf ? 0 : d[i]);&lt;br /&gt;
  fprintf(fout, &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Afisarea costurilor drumurilor minime RECONSTITUIRE DRUM ===&lt;br /&gt;
Mai jos aveti implementare cu matrice de adiacenta, similar poate fi implementat algoritmul folosind liste de adiacenta&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
// Complexitate O(n^2) memorie, timp&lt;br /&gt;
// Afisare drumuri de la 2 la fiecare nod.&lt;br /&gt;
// Atentie! Solutia nu este unica. Pot exista mai multe drumuri de cost minim &lt;br /&gt;
#include &amp;lt;cstdio&amp;gt;&lt;br /&gt;
&lt;br /&gt;
const int maxn = 5001;     // nr maxim de noduri&lt;br /&gt;
const int inf = 1 &amp;lt;&amp;lt; 30;   // infinit&lt;br /&gt;
&lt;br /&gt;
FILE *fin = fopen( &amp;quot;dijkstra.in&amp;quot;, &amp;quot;r&amp;quot; );&lt;br /&gt;
FILE *fout = fopen( &amp;quot;dijkstra.out&amp;quot;,&amp;quot;w&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
int n, m;&lt;br /&gt;
int d[maxn]; // costurile de la start la toate nodurile&lt;br /&gt;
int s[maxn]; // marchez nodurile selectate (nodurile pentru care am gasit deja drumul minim)&lt;br /&gt;
int t[maxn]; // predecesorii fiecarui nod i in drumul de la nodul de start&lt;br /&gt;
int M[maxn][maxn];&lt;br /&gt;
&lt;br /&gt;
void read() {&lt;br /&gt;
  fscanf( fin, &amp;quot;%d %d&amp;quot;, &amp;amp;n, &amp;amp;m );&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    for( int j = 1; j &amp;lt;= n; j++ )&lt;br /&gt;
      M[i][j] = inf;&lt;br /&gt;
  int x, y, cost;&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= m; i++ ) {&lt;br /&gt;
    fscanf(fin, &amp;quot;%d %d %d&amp;quot;, &amp;amp;x, &amp;amp;y, &amp;amp;cost );  // citim arcul si costul asociat&lt;br /&gt;
    M[x][y] = cost;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void dijkstra( int start ) {&lt;br /&gt;
&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ ) // initializam toate drumurile de la start la fiecare nod&lt;br /&gt;
    d[i] = inf;&lt;br /&gt;
  d[start] = 0;                  // dist de la start la el insusi e 0&lt;br /&gt;
&lt;br /&gt;
  int min, pmin = 0;    // costul minim si nodul cu costul minim pana la start&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
&lt;br /&gt;
    min = inf;                   // determin nodul cel mai apropiat de nodul de start&lt;br /&gt;
    for ( int j = 1; j &amp;lt;= n; j++ )&lt;br /&gt;
      if ( d[j] &amp;lt; min &amp;amp;&amp;amp; !s[j] )&lt;br /&gt;
        min = d[j], pmin = j;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // parcurgem lista vecinilor nodului selectat pmin&lt;br /&gt;
    // pentru a vedea daca prin acest nod se ajunge mai repede la vecinii sai, pornind din start&lt;br /&gt;
    s[pmin] = 1;         // marcam ca si selectat nodul intermediar&lt;br /&gt;
    for(int i = 1; i &amp;lt;= n; i++){&lt;br /&gt;
      if ( d[i] &amp;gt; d[pmin] + M[pmin][i]){ // dc costul deja memorat al nodului nr_nod e mai mare decat costul prin nodul intermediar pmin&lt;br /&gt;
        d[i] = d[pmin] + M[pmin][i];      // actualizam costul in vectorul de costuri d&lt;br /&gt;
        t[i] = pmin;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
void afisare_drum( int i ){&lt;br /&gt;
  if( t[i] )&lt;br /&gt;
    afisare_drum ( t[i] );&lt;br /&gt;
  fprintf(fout, &amp;quot;%d &amp;quot;, i );&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
  read();                     // citim muchiile si costurile acestora, construind listele de adiagenta&lt;br /&gt;
  int start = 1;              // fixam nodul de pornire 1&lt;br /&gt;
  dijkstra(start);            // calculam distantele de la nodul start la toate celelalte&lt;br /&gt;
  for ( int i = 1; i &amp;lt;= n; i++ )    // afisam dinstantele de la nodul start la fiecare nod&lt;br /&gt;
    if( i != start ){&lt;br /&gt;
      afisare_drum( i );&lt;br /&gt;
      fprintf( fout, &amp;quot;\n&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
  fprintf(fout, &amp;quot;\n&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Acest algoritm presupune calcularea distantei minime de la un nod la toate celelalte noduri. Acest algoritm merge atat pe grafuri orientate, cat si pe cele neorientate.&lt;br /&gt;
Rezolvarea acestui algoritm aduce in vedere utilizarea unei structuri noi numita priority queue, care sorteaza elementele dintr-un vector dupa anumite criterii la fiecare adaugare a unui element nou.&lt;br /&gt;
Astfel, aceasta structura va avea doua elemente, prima care reprezinta distanta minima pentru a ajunge la nodul curent, ia a doua reprezentand nodul curent. Elementele din vectorul folosit vor fi sortate dupa prima componenta, adica dupa distanta minima pana la nodul curent. Distantele finale se vor retine intr-un vector numit rasp_dist;&lt;br /&gt;
La fiecare pas se vor lua doua vaiabile, c_nod si c_dist, reprzentand nodul curent si distanta pana la nodul curent. Se va verifica daca valoarea lui c_dist este mai mica sau egala cu valoarea lui rasp_dist[c_nod]. Daca da, se vor lua toti vecinii lui c_nod si sse va verifica daca c_dist+distanta de la nodul curent la nodul vecin&amp;lt;rap_dist[nodul vecin]. Daca da, semodifica rasp_dist si se adauga in vector noul element. Procesul se repeta cat tim exista elemente in vector.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
#include &amp;lt;algorithm&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
using namespace std;&lt;br /&gt;
 &lt;br /&gt;
const int nmax=50005;&lt;br /&gt;
const int lim=100000000;&lt;br /&gt;
 &lt;br /&gt;
int n, m;&lt;br /&gt;
 &lt;br /&gt;
priority_queue &amp;lt; pair &amp;lt;int, int&amp;gt;, vector &amp;lt; pair &amp;lt;int, int&amp;gt; &amp;gt;, greater &amp;lt; pair &amp;lt;int, int&amp;gt; &amp;gt; &amp;gt; heap;//vectorul in care se retin nodurile si distantele, dupa cod explicarea sintaxei&lt;br /&gt;
vector &amp;lt; pair &amp;lt;int, int&amp;gt; &amp;gt; graph[nmax];//graful&lt;br /&gt;
int dist[nmax];//vectorul de raspunsuri&lt;br /&gt;
 &lt;br /&gt;
void dijkstra(int start_node)&lt;br /&gt;
{&lt;br /&gt;
    //initial toate distantele au valoarea infinit&lt;br /&gt;
    for(int i=1;i&amp;lt;=n;i++)&lt;br /&gt;
        dist[i]=lim;&lt;br /&gt;
    //e clar ca distanta fata de nodul de inceput este 0&lt;br /&gt;
    dist[start_node]=0;&lt;br /&gt;
    heap.push(make_pair(0, start_node));&lt;br /&gt;
    //se adauga mereu distanta prima, deoarece elementele vectorului se sorteaza dupa prima celula a perechii&lt;br /&gt;
    while(heap.size()&amp;gt;0)&lt;br /&gt;
    {&lt;br /&gt;
        int nod=heap.top().second;//nodul curent&lt;br /&gt;
        int cost=heap.top().first;//distanta curenta&lt;br /&gt;
        heap.pop();&lt;br /&gt;
        if(cost&amp;lt;=dist[nod])&lt;br /&gt;
        {&lt;br /&gt;
            for(int i=0;i&amp;lt;graph[nod].size();i++)&lt;br /&gt;
            {&lt;br /&gt;
                int nod_l=graph[nod][i].first;//nodul vecin&lt;br /&gt;
                int cost_l=graph[nod][i].second;//distanta pana la nodul vecin&lt;br /&gt;
                if(dist[nod_l]&amp;gt;cost+cost_l)//distanta curenta + distanta pana la vecin&lt;br /&gt;
                {&lt;br /&gt;
                    dist[nod_l]=cost+cost_l;//modificarea vectorului de raspunsuri&lt;br /&gt;
                    heap.push(make_pair(dist[nod_l], nod_l));//adaugarea unui element nou in vetctor&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main()&lt;br /&gt;
{&lt;br /&gt;
    freopen(&amp;quot;dijkstra.in&amp;quot;, &amp;quot;r&amp;quot;, stdin);&lt;br /&gt;
    freopen(&amp;quot;dijkstra.out&amp;quot;, &amp;quot;w&amp;quot;, stdout);&lt;br /&gt;
   &lt;br /&gt;
    //citirea variabilelor&lt;br /&gt;
    scanf(&amp;quot;%d%d&amp;quot;, &amp;amp;n, &amp;amp;m);&lt;br /&gt;
    for(int i=1;i&amp;lt;=m;i++)&lt;br /&gt;
    {&lt;br /&gt;
        int a, b, c;&lt;br /&gt;
        scanf(&amp;quot;%d%d%d&amp;quot;, &amp;amp;a, &amp;amp;b, &amp;amp;c);&lt;br /&gt;
        graph[a].push_back(make_pair(b, c));&lt;br /&gt;
    }&lt;br /&gt;
    //apelarea fuctiei care retine distanta minima de la nodul 1 la celelalte noduri&lt;br /&gt;
    dijkstra(1);&lt;br /&gt;
    //afisarea distantelor&lt;br /&gt;
    for(int i=2;i&amp;lt;=n;i++)&lt;br /&gt;
    {&lt;br /&gt;
        if(dist[i]==lim)&lt;br /&gt;
            printf(&amp;quot;0 &amp;quot;);&lt;br /&gt;
        else&lt;br /&gt;
            printf(&amp;quot;%d &amp;quot;, dist[i]);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;\n&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Sintaxa de priority_queue:&lt;br /&gt;
priority_queue &amp;lt; pair &amp;lt;int, int&amp;gt;, vector &amp;lt; pair &amp;lt;int, int&amp;gt; &amp;gt;, greater &amp;lt; pair &amp;lt;int, int&amp;gt; &amp;gt; &amp;gt; heap;&lt;br /&gt;
&lt;br /&gt;
Prima celula reprezinta tipul de elemente din cadrul sructurii utilizate. Acestea pot fi int, long long, pair&amp;lt;&amp;gt; etc.;&lt;br /&gt;
A doua celula reprezinta structura utilizata. Aceasta poate fi vector, struct etc.;&lt;br /&gt;
A treia celula e optionala. In cazul in care vrei elementele sortate crescator, se scrie greater&amp;lt;prima celula folosita&amp;gt;. Altfel, nu se scrie nimic si se sorteaza elementele in ordine descrescatoare;&lt;br /&gt;
&lt;br /&gt;
= TEMA = &lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=588 Dijkstra pbinfo]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1887 Dijkstra2 pbinfo]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=591 Firma]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=593 Parc]&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=1069 Ubuntzei] (Grea)OJI 2011, Clasele XI-XII&lt;br /&gt;
* [https://www.pbinfo.ro/?pagina=probleme&amp;amp;id=630 Joc] - Reconstituire drum&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_26&amp;diff=17570</id>
		<title>Clasa a XI-a lecția 26</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_XI-a_lec%C8%9Bia_26&amp;diff=17570"/>
		<updated>2020-03-23T10:53:29Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* Algoritmul Roy Floyd */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Algoritmul Roy Floyd ==&lt;br /&gt;
[https://infoarena.ro/problema/royfloyd Royfloyd]&lt;br /&gt;
&lt;br /&gt;
Se da un graf orientat cu &#039;&#039;&#039;N&#039;&#039;&#039; noduri, memorat prin matricea ponderilor. Sa se determine pentru orice pereche de noduri x si y lungimea minima a drumului de la nodul x la nodul y si sa se afiseze matricea drumurilor minime. Prin lungimea unui drum intelegem suma costurilor arcelor care-l alcatuiesc.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
/// doar distanta minima de la toate nodurile la toate&lt;br /&gt;
/// se afiseaza matricea drumurilor minime rezultate&lt;br /&gt;
/// complexitate n^3&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int n, a[105][105];&lt;br /&gt;
&lt;br /&gt;
void citire(){&lt;br /&gt;
  freopen(&amp;quot;royfloyd.in&amp;quot;,&amp;quot;r&amp;quot;,stdin);&lt;br /&gt;
  freopen(&amp;quot;royfloyd.out&amp;quot;,&amp;quot;w&amp;quot;,stdout);&lt;br /&gt;
&lt;br /&gt;
  int i, j;&lt;br /&gt;
  scanf( &amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
  for (i = 1; i &amp;lt;= n; i++)&lt;br /&gt;
    for (j = 1; j &amp;lt;= n; j++)&lt;br /&gt;
      scanf(&amp;quot;%d&amp;quot;,&amp;amp;a[i][j]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void roy_floyd(){&lt;br /&gt;
  int i, j, k;&lt;br /&gt;
  for ( k = 1; k &amp;lt;= n; k++ )&lt;br /&gt;
    for ( i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
      for ( j = 1; j &amp;lt;= n; j++ )&lt;br /&gt;
        if ( i != j &amp;amp;&amp;amp; a[i][k] &amp;amp;&amp;amp; a[k][j] &amp;amp;&amp;amp; ( a[i][j] &amp;gt; a[i][k] + a[k][j] || !a[i][j] ) )&lt;br /&gt;
          a[i][j] = a[i][k] + a[k][j];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void afis(){&lt;br /&gt;
  int i, j;&lt;br /&gt;
  for ( i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    for ( j = 1; j &amp;lt;= n; j++ ) &lt;br /&gt;
      printf( &amp;quot;%d &amp;quot;,a[i][j] );&lt;br /&gt;
    printf( &amp;quot;\n&amp;quot; );&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
int main(){&lt;br /&gt;
  citire();&lt;br /&gt;
  roy_floyd();&lt;br /&gt;
  afis();&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://infoarena.ro/problema/r Roy Floyd]&lt;br /&gt;
Aceeasi problema. Vom afisa suplimentar, pe langa matricea cu drumurile minime de la oricare doua noduri si o a doua matrice ce va retine cate strazi maxim pargurg pe drumurile minime.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
#include &amp;lt;bits/stdc++.h&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
 &lt;br /&gt;
ifstream f(&amp;quot;rf.in&amp;quot;);&lt;br /&gt;
ofstream g(&amp;quot;rf.out&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
const int N = 1001;&lt;br /&gt;
int a[N][N], b[N][N];&lt;br /&gt;
int n;&lt;br /&gt;
 &lt;br /&gt;
void citire() {&lt;br /&gt;
  f &amp;gt;&amp;gt; n;&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ )&lt;br /&gt;
    for( int j = 1; j &amp;lt;= n; j++ ) {&lt;br /&gt;
      f &amp;gt;&amp;gt; a[i][j]; &lt;br /&gt;
      if( i != j ) &lt;br /&gt;
        b[i][j] = 1;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void roy() {&lt;br /&gt;
  for(int k=1; k&amp;lt;=n; k++)&lt;br /&gt;
    for(int i=1; i&amp;lt;=n; i++)&lt;br /&gt;
      for(int j=1; j&amp;lt;=n; j++)&lt;br /&gt;
        if((a[i][j] &amp;gt; a[i][k] + a[k][j]) or (a[i][j] == a[i][k] + a[k][j] and b[i][j] &amp;lt; b[i][k] + b[k][j])) {&lt;br /&gt;
          b[i][j] = b[i][k] + b[k][j];&lt;br /&gt;
          a[i][j] = a[i][k] + a[k][j];&lt;br /&gt;
        }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
void afisare() {&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    for(int j = 1; j &amp;lt;= n; j++ )&lt;br /&gt;
      g &amp;lt;&amp;lt; a[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
      g &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
  }&lt;br /&gt;
  for( int i = 1; i &amp;lt;= n; i++ ) {&lt;br /&gt;
    for( int j = 1; j &amp;lt;= n; j++ )&lt;br /&gt;
       g &amp;lt;&amp;lt; b[i][j] &amp;lt;&amp;lt; &amp;quot; &amp;quot;;&lt;br /&gt;
       g &amp;lt;&amp;lt; &amp;quot;\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
int main() {&lt;br /&gt;
  citire();&lt;br /&gt;
  roy();&lt;br /&gt;
  afisare();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
Pbinfo&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/1604/dmin dmin]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/589/roy-floyd Roy-Floyd]&lt;br /&gt;
*[https://www.pbinfo.ro/probleme/1652/rf rf]&lt;br /&gt;
&lt;br /&gt;
Infoarena&lt;br /&gt;
*[https://infoarena.ro/problema/royfloyd royfloyd]&lt;br /&gt;
*[https://infoarena.ro/problema/rfinv rfinv]&lt;br /&gt;
*[https://infoarena.ro/problema/coach coach]&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Tmp_6&amp;diff=17481</id>
		<title>Tmp 6</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Tmp_6&amp;diff=17481"/>
		<updated>2020-02-28T23:59:43Z</updated>

		<summary type="html">&lt;p&gt;Bella: /* TEMA */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note curs: Isabela Coman&#039;&#039;&#039;&lt;br /&gt;
= Lecție =&lt;br /&gt;
&lt;br /&gt;
== Reprezentarea în memorie a valorilor întregi ==&lt;br /&gt;
&lt;br /&gt;
Valorile întregi se reprezintă în memorie ca o secvență de biți (cifre binare, 0 și 1). Acestă secvență poate avea 8, 16, 32 sau 64 de biți. &lt;br /&gt;
Reprezentarea în memorie a datelor de tip întreg se face în mod similar pentru toate tipurile cu semn (char, short int, int, long long int) și similar pentru toate tipurile fără semn (unsigned char, unsigned short int, unsigned int, unsigned long long int).&lt;br /&gt;
În exemplele care urmează vom folosi tipurile reprezentate pe 16 biți: unsigned short int, respectiv short int.&lt;br /&gt;
Reprezentarea în memorie a valorilor de tip unsigned short int&lt;br /&gt;
Tipul unsigned short int memorează valori mai mari sau egale cu 0. Acestea se reprezintă în memorie astfel:&lt;br /&gt;
* se transformă numărul în baza 2 și se memorează, adăugând la început cifre de 0 nesemnificative, atâtea câte sunt necesare până la completarea celor 16 biți.&lt;br /&gt;
* dacă reprezentarea în baza 2 a numărului are mai mult de 16 cifre, se vor memora numai ultimele 16 cifre – numărul se va trunchia.&lt;br /&gt;
Astfel, valorile fără semn care se pot reprezenta pe 16 biți sunt cuprinse între 0 și 2&amp;lt;sup&amp;gt;16&amp;lt;/sup&amp;gt;-1, adică 0 și 65535.&lt;br /&gt;
 0 se reprezintă     0000000000000000&lt;br /&gt;
 65535 se reprezintă 1111111111111111&lt;br /&gt;
 5 se reprezintă     0000000000000101&lt;br /&gt;
 133 se reprezintă   0000000010000101&lt;br /&gt;
Reprezentarea în memorie a valorilor de tip short int&lt;br /&gt;
Tipul short int memorează atât valori pozitive, cât și valori negative. Astfel, dintre cei 16 biți disponibili, cel mai din dreapta (numit bit de semn) stabilește semnul numărului. Dacă acest bit este 0, numărul este pozitiv, dacă acest bit este 1, numărul este negativ. Astfel, se pot memora 32768 valori negative, de la -32768 la -1, și 32768 pozitive sau zero, de la 0 la 32767.&lt;br /&gt;
Modalitatea de reprezentarea în memorie a întregilor se numește cod complementar.&lt;br /&gt;
Reprezentarea numerelor pozitive se face exact ca mai sus: se transformă numărul în baza 2 și se completează cu zerouri nesemnificative. Nu la fel se face reprezentarea numerelor întregi negative. Această reprezentare se face conform pașilor următori:&lt;br /&gt;
se determină reprezentarea în memorie a numărului ce reprezintă valoarea absolută a numărului inițial. Aceasta are bitul de semn 0.&lt;br /&gt;
se determină complementul față de 1 a reprezentării de la pasul anterior – fiecare bit 1 devine 0 și fiecare bit 0 devine 1.&lt;br /&gt;
se adună 1 la valoarea obținută&lt;br /&gt;
De exemplu, pentru reprezentarea în memorie a numărului -133 (considerat de tip short int) se procedează astfel:&lt;br /&gt;
 se determină reprezentarea în memorie a lui 133&lt;br /&gt;
 se obține complementul față de 1&lt;br /&gt;
 se adună 1 și se obține:&lt;br /&gt;
 0000000010000101&lt;br /&gt;
 1111111101111010&lt;br /&gt;
 1111111101111011&lt;br /&gt;
Mecanismul de memorare numerelor este același pentru toate tipurile întregi. Diferă numai numărul de biți folosiți pentru reprezentare și implicit intervalul din care fac parte valorile reprezentate.&lt;br /&gt;
&lt;br /&gt;
== Operatori logici pe biti ==&lt;br /&gt;
Operatorii la nivel de bit se aplica fiecărui bit din reprezentarea operanzilor întregi, spre deosebire de restul operatorilor care se aplică valorilor operanzilor.&lt;br /&gt;
&lt;br /&gt;
Din această categorie fac parte operatorii următori, care apar in ordinea descrescatoare a priorității:&lt;br /&gt;
&lt;br /&gt;
====  Negaţia pe biţi &#039;&#039;&#039;~&#039;&#039;&#039; ====&lt;br /&gt;
Acest operator are ca efect schimbarea biților unui număr din 0 in 1 si din 1 in 0.&lt;br /&gt;
&lt;br /&gt;
====  Deplasarea la stânga/ la dreapta pe biți &#039;&#039;&#039;&amp;lt;&amp;lt;, &amp;gt;&amp;gt;&#039;&#039;&#039;====&lt;br /&gt;
&lt;br /&gt;
* Expresia &#039;&#039;&#039;x &amp;lt;&amp;lt; i&#039;&#039;&#039; este echivalentă cu expresia x * 2&amp;lt;sup&amp;gt;i&amp;lt;/sup&amp;gt;. Are ca efect eliminarea celor mai din stânga i biţi ai lui x şi adaugarea la dreapta i biţi de 0. &lt;br /&gt;
De exemplu, dacă x = 1110&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt;, atunci x &amp;lt;&amp;lt; 2 înseamnă 111000&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 56 (adică 14 * 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
* Expresia &#039;&#039;&#039;x &amp;gt;&amp;gt; i&#039;&#039;&#039; este echivalentă cu x div 2&amp;lt;sup&amp;gt;i&amp;lt;/sup&amp;gt; . Operatorul de deplasare la dreapta elimină cei mai din dreapta i biţi ai lui x şi adaugă la stânga i biţi de 0. &lt;br /&gt;
De exemplu, dacă x = 1110&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt;, atunci x &amp;gt;&amp;gt; 2 înseamnă 0011&amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 3 (adică 14 div 2&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
==== Si pe biţi &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039;====&lt;br /&gt;
 n1  1010 &amp;amp; &lt;br /&gt;
 n2  1011 = &lt;br /&gt;
 rez 1010&lt;br /&gt;
&lt;br /&gt;
==== Sau exclusiv pe biţi (xor) &#039;&#039;&#039;^&#039;&#039;&#039;====&lt;br /&gt;
 n1  1010 ^ &lt;br /&gt;
 n2  1011  &lt;br /&gt;
 rez 0001 &lt;br /&gt;
==== Sau pe biţi &#039;&#039;&#039;|&#039;&#039;&#039;====&lt;br /&gt;
 n1  1010 | &lt;br /&gt;
 n2  1011  &lt;br /&gt;
 rez 1011 &lt;br /&gt;
&lt;br /&gt;
== Prioritatea operatorilor ( precedenta operatorilor ) ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;border-spacing:0;width:11.038cm;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#dee7ec;border:none;padding:0cm;&amp;quot;&lt;br /&gt;
|| &#039;&#039;&#039;Operator &#039;&#039;&#039;&lt;br /&gt;
| align=center| &#039;&#039;&#039;Descriere &#039;&#039;&#039;&lt;br /&gt;
| align=center| &#039;&#039;&#039;Asociativitate &#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;~&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Complement faţă de 1 pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;lt;&amp;lt; si &amp;gt;&amp;gt;&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Deplasare stânga/dreapta a biţilor &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | ŞI pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;^&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | SAU-EXCLUSIV pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;|&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | SAU pe biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | stânga-dreapta &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;amp;=&#039;&#039;&#039; și &#039;&#039;&#039;|=&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Atribuire cu ŞI/SAU &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;^=&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Atribuire cu SAU-EXCLUSIV &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | &#039;&#039;&#039;&amp;lt;&amp;lt;=&#039;&#039;&#039; şi &#039;&#039;&#039;&amp;gt;&amp;gt;=&#039;&#039;&#039; &lt;br /&gt;
| style=&amp;quot;border:none;padding:0cm;&amp;quot; | Atribuire cu deplasare de biţi &lt;br /&gt;
| align=center style=&amp;quot;border:none;padding:0cm;&amp;quot; | dreapta-stânga &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Aplicații ale operatorilor pe biţi ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Inmultirea cu 2===&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se afişeze valoarea &#039;&#039;&#039;2*k&#039;&#039;&#039;.&lt;br /&gt;
Vom folosi operatorul de deplasare la stânga pe biţi: n &amp;lt;&amp;lt; 1. Deci secvenţa va fi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(n &amp;lt;&amp;lt; 1) ;    //echivalent cu n = n * 2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Catul impartirii la 2===&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se afişeze valoarea &#039;&#039;&#039;n/2&#039;&#039;&#039;.&lt;br /&gt;
Vom folosi operatorul de deplasare la stânga pe biţi: n &amp;gt;&amp;gt; 1. Deci secvenţa va fi:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(n &amp;gt;&amp;gt; 1) ;   //echivalent cu n = n / 2; &lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Restul impartirii la 2===&lt;br /&gt;
&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se afişeze valoarea &#039;&#039;&#039;n % 2&#039;&#039;&#039;.&lt;br /&gt;
Vom aplica operatorul &amp;amp; între n si numărul 1 (numărul 1 joacă rol de mască). Aceasta masca are primii biţi 0 si ultimul bit 1. Astfel incat dacă n &amp;amp; 1 va avea ca efect extragerea ultimei cifre binare a lui n. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(n &amp;amp; 1) ;   //echivalent cu n = n % 2; catul impartirii la 2;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Verificarea parității ===&lt;br /&gt;
Se consideră un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se verifice dacă &#039;&#039;&#039;n&#039;&#039;&#039; este par sau impar.&lt;br /&gt;
&lt;br /&gt;
Ex1: pentru n este impar, avem ultima cifra binara 1. De exemplu, n = 13 se scrie în baza 2 ca 1101. Atunci &lt;br /&gt;
 1101 &amp;amp; &lt;br /&gt;
 0001 =&lt;br /&gt;
 0001&lt;br /&gt;
Ex2: pentru n este par, avem ultima cifra binara 0. De exemplu, n = 14 se scrie în baza 2 ca 1110.Atunci &lt;br /&gt;
 1110 &amp;amp; &lt;br /&gt;
 0001 = &lt;br /&gt;
 0000 &lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
if (( n &amp;amp; 1 ) == 1) printf( &amp;quot;Numar impar&amp;quot; );&lt;br /&gt;
else cout &amp;lt;&amp;lt; printf(&amp;quot;Numar par&amp;quot;) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ATENȚIE! operatorul &#039;&#039;&#039;&amp;amp;&#039;&#039;&#039;, ca si operatorii &#039;&#039;&#039;^&#039;&#039;&#039; si &#039;&#039;&#039;|&#039;&#039;&#039;, are prioritate mai mica decat operatorul &#039;&#039;&#039;==&#039;&#039;&#039;, de aceea este necesara utilizarea parantezelor pentru a da prioritate operatorului &amp;amp; în expresia instrucţiunii if. ( Expresia n &amp;amp; 1 == 1 este interpretată de compilator ca fiind n &amp;amp; (1 == 1) )&lt;br /&gt;
&lt;br /&gt;
===2 la puterea k ===&lt;br /&gt;
Se citeşte un număr natural &#039;&#039;&#039;k&#039;&#039;&#039; &amp;lt;= 15. Să se afişeze valoarea &#039;&#039;&#039;2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;&#039;&#039;&#039;.&lt;br /&gt;
Vom folosi operatorul de deplasare la stânga pe biţi: 1 &amp;lt;&amp;lt; k. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;k);&lt;br /&gt;
printf(&amp;quot;%d&amp;quot;, 1 &amp;lt;&amp;lt; k) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Câtul și restul împărțirii lui n la 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt; ===&lt;br /&gt;
Se consideră un număr natural &#039;&#039;&#039;n&#039;&#039;&#039;. Să se determine câtul şi restul împărţirii lui n la un număr &#039;&#039;&#039;m&#039;&#039;&#039; de forma 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Împărțirea unui număr zecimal la o putere a lui 10 are ca efect împărțirea numarului zecimal in 2 părți: câtul și restul impărțirii numarului la puterea lui 10. Similar, împărțirea unui număr la o putere a lui 2, separă reprezentarea binara a acestuia de asemenea în 2 zone: câtul și restul impărțirii numarului la puterea lui 2.&lt;br /&gt;
&lt;br /&gt;
Ex: pentru numarul : 12345 prin impărțire la 100 separăm numarul in 2:  &amp;lt;span style=&amp;quot;background:yellowgreen&amp;quot;&amp;gt;123&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;background:LightSeaGreen&amp;quot;&amp;gt;45&amp;lt;/span&amp;gt;; 123 = n div 100, 45 = n mod 100.&lt;br /&gt;
&lt;br /&gt;
Similar pentru reprezentarea binara:&lt;br /&gt;
&lt;br /&gt;
n = 20 = &amp;lt;span style=&amp;quot;background:yellowgreen&amp;quot;&amp;gt;101&amp;lt;/span&amp;gt;&amp;lt;span style=&amp;quot;background:LightSeaGreen&amp;quot;&amp;gt;00&amp;lt;/span&amp;gt;&lt;br /&gt;
n div 4 = 101 &amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 5 &amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&lt;br /&gt;
n mod 4 = 00 &amp;lt;sub&amp;gt;(2)&amp;lt;/sub&amp;gt; = 0 &amp;lt;sub&amp;gt;(10)&amp;lt;/sub&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Putem să obținem aceleași rezultate și prin folosirea operațiilor pe biți.&lt;br /&gt;
Pentru aflarea câtului vom folosi operatorul de deplasare pe biți. Trebuie însă să îl știm pe k = puterea lui 2.&lt;br /&gt;
&lt;br /&gt;
Pentru rest se utilizează expresia n &amp;amp; (m-1) , deoarece m-1  are toti biții 1, m-1 si in acest fel extragem doar ultimii m-1 biți.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt; &lt;br /&gt;
scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
printf(&amp;quot;Catul este : %d&amp;quot;, n &amp;gt;&amp;gt; k ) ;&lt;br /&gt;
printf(&amp;quot;Restul este : %d&amp;quot;, (n &amp;amp; (m-1) ) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ex:&lt;br /&gt;
20 div 4 = 20 &amp;gt;&amp;gt; 2 = 5&lt;br /&gt;
&lt;br /&gt;
 10100 &lt;br /&gt;
   &amp;gt;&amp;gt;2=&lt;br /&gt;
 00101&lt;br /&gt;
&lt;br /&gt;
20 mod 4 = 20 &amp;amp; 3 = 5&lt;br /&gt;
&lt;br /&gt;
 10100 &amp;amp;&lt;br /&gt;
 00011=&lt;br /&gt;
 00000&lt;br /&gt;
&lt;br /&gt;
===Verificare daca n este o putere a lui 2===&lt;br /&gt;
Se consideră un număr natural n. Să se verifice dacă n este sau nu o putere a lui 2.&lt;br /&gt;
Rezolvare: Acesta este o problemă destul de cunoscută. Dacă n este o putere a lui 2, atunci reprezentarea sa în baza 2 are un singur bit 1, restul fiind 0. Ceea ce inseamna ca daca vom incerca sa eliminam ultimul bit semnificativ de 1, folosind masca ( n-1 ) va trebui sa obtinem valoarea 0. &lt;br /&gt;
 &lt;br /&gt;
( Dacă n este o putere a lui 2, este de forma 0000000000100000, atunci n-1 are reprezentarea de forma 0000000000011111, adică bitul 1 s-a transformat în 0, iar biţii de la dreapta sunt acum toţi 1. Deci o expresie de forma n &amp;amp; (n-1) va furniza rezultatul 0 dacă şi numai dacă n este o putere a lui 2. )&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
scanf ( &amp;quot;%d&amp;quot;, &amp;amp;n) ;&lt;br /&gt;
if ( (n &amp;amp; (n-1)) == 0 ) &lt;br /&gt;
  printf( &amp;quot;n este putere a lui 2&amp;quot; );&lt;br /&gt;
else &lt;br /&gt;
  printf( &amp;quot;n nu este putere a lui 2&amp;quot;) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Numararea bitilor de 1 din scrierea binară a unui număr n ===&lt;br /&gt;
&lt;br /&gt;
Rezolvarea naivă a acestei probleme ar consta în parcurgerea secvenţială a biţilor lui n. În continuare vă prezint această rezolvare:&lt;br /&gt;
 &lt;br /&gt;
int count(long n) {&lt;br /&gt;
    int num = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; 32; i++)&lt;br /&gt;
        if (n &amp;amp; (1 &amp;lt;&amp;lt; i)) num++;&lt;br /&gt;
    return num;&lt;br /&gt;
}&lt;br /&gt;
Dacă ne uităm cu atenţie şi analizăm rezultatul operaţiei n &amp;amp; (n - 1) putem obţine o soluţie mai bună. Să luăm un exemplu:&lt;br /&gt;
&lt;br /&gt;
 11011101010000 = n&lt;br /&gt;
 11011101001111 = n - 1&lt;br /&gt;
 11011101000000 = n &amp;amp; (n - 1)&lt;br /&gt;
&lt;br /&gt;
Se vede clar de aici că efectul operaţiei n &amp;amp; (n - 1) este anularea celui mai nesemnificativ bit cu valoarea 1.&lt;br /&gt;
&lt;br /&gt;
De aici ideea algoritmului:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
int count(long n) {&lt;br /&gt;
    int num = 0;&lt;br /&gt;
    if (n)&lt;br /&gt;
        do num++; while (n &amp;amp;= n - 1);&lt;br /&gt;
    return num;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Transformarea unui bit în 1 ===&lt;br /&gt;
 &lt;br /&gt;
Pornim de la valoarea întreagă n = 50. Reprezentarea acestuia pe 8 biti este 00110010. Presupunem că dorim setarea bitului 2 la valoarea 1. Pentru aceasta vom folosi o mască logică în care doar bitul 2 este 1 restul bitilor fiind 0, adică M = 00000100. Pentru a obtine valoarea lui M vom deplasa valoarea 1 cu spre 2 biti spre stanga. Aplicand operatia de de disjunctie &amp;quot;SAU pe biti&amp;quot; aplicată asupra lui n şi a lui M, conduce la obtinerea rezultatului dorit. &lt;br /&gt;
 &lt;br /&gt;
 n   00110010 |&lt;br /&gt;
 M   00000100  &lt;br /&gt;
 Rez 00110110 &lt;br /&gt;
 &lt;br /&gt;
Generalizând, dacă se doreşte ca valorii n, să i se seteze la valoarea 1, bitul B (0≤B≤7), atunci vom avea:&lt;br /&gt;
 n = n | (1 &amp;lt;&amp;lt; B)&lt;br /&gt;
&lt;br /&gt;
=== Transformarea unui bit în 0 ===&lt;br /&gt;
 &lt;br /&gt;
Să luăm ca exemplu n= 109, pentru a vedea cum se setează un bit la valoarea 0. Reprezentarea internă a lui este 01101101. Se cere să se seteze bitul 5 la valoarea 0. De data aceasta masca va conŃine toti bitii de 1, exceptie bitul 5. Aspura lui n şi M vom aplica ŞI logic.  &lt;br /&gt;
 &lt;br /&gt;
 n    01101101 &amp;amp;  &lt;br /&gt;
 M    11011111  &lt;br /&gt;
 Rez  01001101 &lt;br /&gt;
&lt;br /&gt;
Presupunem că dorim să setăm la 0 valoarea bitului B (0≤B≤7).  &lt;br /&gt;
 n = n &amp;amp; ~(1 &amp;lt;&amp;lt; B)&lt;br /&gt;
&lt;br /&gt;
=== Testarea valorii unui bit ===&lt;br /&gt;
Plecăm de la valoarea n = 47. Reprezentarea internă a lui este 00101111. Presupunem că dorim să cunoaştem valoarea bitului 3 şi bitului 6. Vom folosi măştile M1=00001000 şi M2=01000000. Vom aplica de fiecare dată ŞI logic între n şi cele două măşti: &lt;br /&gt;
 &lt;br /&gt;
 n   00101111 &amp;amp;  &lt;br /&gt;
 M1  00001000  &lt;br /&gt;
 Rez 00001000 &lt;br /&gt;
Respectiv  &lt;br /&gt;
 n   00101111 &amp;amp;  &lt;br /&gt;
 M2  01000000  &lt;br /&gt;
 Rez 00000000 &lt;br /&gt;
&lt;br /&gt;
Generalizând, testarea se va realiza prin : &lt;br /&gt;
n &amp;amp; ( 1 &amp;lt;&amp;lt; B )&lt;br /&gt;
&lt;br /&gt;
===Testarea valorilor ultimilor biti ===&lt;br /&gt;
 &lt;br /&gt;
Pornim de la valoarea întreagă n=50. Reprezentarea acestuia pe 8 biti este 00110010. Presupunem că dorim să cunoaştem restul la împărtirea întreagă a lui n la 8, adică n%8. Valoarea ultimilor 3 biti din reprezentarea internă a lui, reprezintă tocmai acest rest. Pentru aceasta vom folosi o mască în care ultimii trei bitii sunt 1 restul 0. Aceasta mască are valoarea 7, adică 00000111. Vom aplica operatia ŞI logic. &lt;br /&gt;
 &lt;br /&gt;
 n   00110010 &amp;amp;  &lt;br /&gt;
 M   00000111  &lt;br /&gt;
 Rez 00000010 &lt;br /&gt;
 &lt;br /&gt;
Pe caz general, dacă dorim să cunoaştem valoarea ultimilor B biti (care este egal cu restul împărtirii lui X la 2B) vom exprima astfel: &lt;br /&gt;
 &lt;br /&gt;
 n &amp;amp; (1 &amp;lt;&amp;lt; B–1)&lt;br /&gt;
&lt;br /&gt;
===Scrierea numarului n in baza 2===&lt;br /&gt;
???Se consideră un număr natural n. Să se afişeze reprezentarea lui n în baza 2.&lt;br /&gt;
Rezolvare: Ne bazăm pe faptul că în memorie n este deja reprezentat în baza 2, deci trebuie să-i afişăm biţii de la stânga la dreapta. Presupunând că n este reprezentat pe 16 biţi, pe aceştia îi numerotăm de la dreapta la stânga cu numere de la 0 la 15. Pentru a obţine bitul de pe poziţia i (0 &amp;lt;= i &amp;lt;= 15), utilizăm expresia (n &amp;gt;&amp;gt; i) &amp;amp; 1. Nu rămâne decât să utilizăm expresia pentru fiecare i între 0 şi 15.&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
cin &amp;gt;&amp;gt; n ;&lt;br /&gt;
for (int I = 15 ; i &amp;gt;= 0 ; i--)&lt;br /&gt;
   cout &amp;lt;&amp;lt; ((n &amp;gt;&amp;gt; i) &amp;amp; 1) ;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Memorarea a doi intregi &amp;lt;255 intr-o singura locatie de memorie ===&lt;br /&gt;
Se consideră două numere naturale a şi b, ambele cuprinse între 0 şi 255. Se cere să se memoreze cele două numere într-un întreg n reprezentabil pe 16 biţi fără semn (deci de tip unsigned short).&lt;br /&gt;
Rezolvare: Cele două numere a şi b pot fi reprezentate pe 8 biţi. De aceea cei 16 biţi ai lui n sunt suficienţi. Stocăm a pe primii 8 biţi ai lui n, iar pe b pe ultimii 8 biţi ai lui n. n = a * 256 + b ; De asemenea, dacă se cunoaşte n, se pot obţine valorile lui a şi b astfel: a = n &amp;gt;&amp;gt; 8 ; // sau a = n / 256&lt;br /&gt;
b = n &amp;amp; 255 ; // sau b = n % 256 ;&lt;br /&gt;
&lt;br /&gt;
===Codificare/decodificare=== &lt;br /&gt;
Considerăm un număr pe care dorim să-l codificăm, apoi să-l decodificăm.&lt;br /&gt;
Rezolvare: O modalitate simplă de codificare şi decodificare este utilizarea operatorului pe biţi XOR. Pentru aceasta considerăm o mască (o parolă) şi ne bazăm pe o proprietate interesantă a operatorului XOR: a ^ b ^ b = a. Deci a ^ b realizează codificarea lui a, iar (a ^ b) ^ b realizează decodificarea. Proprietatea se bazează pe faptul că b ^ b = 0, pentru orice b, iar a ^ 0 = a. Metoda poate fi aplicată şi pentru codificarea unui text utilizând o parolă dată. Cu ajutorul parolei aplicată peste textul iniţial se obţine codificarea, iar o a doua aplicare a parolei peste codificare se obţine textul iniţial. Secvenţa care realizează codificarea/decodificarea unui număr este:&lt;br /&gt;
int n, masca;&lt;br /&gt;
n = 65 ;&lt;br /&gt;
masca = 100 ;&lt;br /&gt;
cout &amp;lt;&amp;lt; &amp;quot;\nValoarea initiala a lui n : &amp;quot; &amp;lt;&amp;lt; n ;&lt;br /&gt;
n = n ^ masca ;&lt;br /&gt;
cout&amp;lt;&amp;lt; &amp;quot;\nValoarea codificata a lui n : &amp;quot; &amp;lt;&amp;lt; n ;&lt;br /&gt;
n = n ^ masca ;&lt;br /&gt;
cout&amp;lt;&amp;lt; &amp;quot;\nValoarea decodificata a lui n : &amp;quot; &amp;lt;&amp;lt; n ;&lt;br /&gt;
&lt;br /&gt;
= TEMA1 =&lt;br /&gt;
* [http://varena.ro/problema/aparitii aparitii]&lt;br /&gt;
* [http://varena.ro/problema/paritate paritate]&lt;br /&gt;
Pentru o mai buna fixare a operatiilor pe biti, va sfatuiesc ca din cand in cand sa mai rezolvati cate o problema. Aveti aici cateva probleme:&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=keyword&amp;amp;action=view&amp;amp;id=45 Probleme de pe .campion]&lt;br /&gt;
* Implementati ciurul lui Eratostene pe biti&lt;br /&gt;
&lt;br /&gt;
== Multimi reprezentate pe biti == &lt;br /&gt;
===Sarcina 1===&lt;br /&gt;
O mulțime de numere întregi poate fi reprezentată astfel: spunem că un număr i aparține unei mulțimi S dacă bit-ul al i-lea din vectorul S are valoarea 1. Pentru eficientă, vectorul S va conține date de tipul unsigned char (reamintim ca sizeof(unsigned int) == 1 byte adică 8 biți). &lt;br /&gt;
Implementați următoarele funcții. Realizați un program în C prin care să demonstrați că funcțiile implementate funcționează. &lt;br /&gt;
Vom considera ca urmatoarele constante se aplica pe parcursul urmatoarelor exemple:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  const int MAXN = 1e4; // se seteaza dupa caz&lt;br /&gt;
  const int LOG_BYTE = 3;&lt;br /&gt;
  const int SIZE = (MAXN &amp;gt;&amp;gt; LOG_BYTE) + 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* adăugarea unui element în mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // insert_in_set(s, n) - adauga numarul n in multimea s &lt;br /&gt;
  void insert_in_set(char s[SIZE], unsigned int n) {&lt;br /&gt;
    s[n &amp;gt;&amp;gt; LOG_BYTE] |= (1 &amp;lt;&amp;lt; (n &amp;amp; ((1 &amp;lt;&amp;lt; LOG_BYTE) - 1)));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* ștergerea unui element din mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // delete_from_set(s, n) - scoate numarul n din multime s&lt;br /&gt;
  void delete_from_set(char s[SIZE], unsigned int n) {&lt;br /&gt;
    s[n &amp;gt;&amp;gt; LOG_BYTE] &amp;amp;= ~(1 &amp;lt;&amp;lt; (n &amp;amp; ((1 &amp;lt;&amp;lt; LOG_BYTE) - 1)));&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* verificarea faptului că un element n aparține unei mulțimi&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // is_in_set(s, n) - returneaza 1 daca n este in s, 0 altfel&lt;br /&gt;
  int is_in_set(char s[SIZE], unsigned int n) {&lt;br /&gt;
    return (s[n &amp;gt;&amp;gt; LOG_BYTE] &amp;amp;= (1 &amp;lt;&amp;lt; (n &amp;amp; ((1 &amp;lt;&amp;lt; LOG_BYTE) - 1)))) &amp;gt; 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* ștergerea tuturor elementelor din mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // delete_all_from_set(s) - elimina toate elementele din multime&lt;br /&gt;
  void delete_all_from_set(char s[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE: ++i)&lt;br /&gt;
      s[i] = 0;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* calcularea cardinalul unei mulțimi&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  /// card_set(s) - returneaza cardinalul multimii s&lt;br /&gt;
  int card_set(char s[SIZE]) {&lt;br /&gt;
    int c = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i) {&lt;br /&gt;
      int aux = s[i];&lt;br /&gt;
      while (aux &amp;gt; 0) {&lt;br /&gt;
        aux &amp;amp;= (aux - 1);&lt;br /&gt;
        ++c;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return c;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* verificarea faptului că mulțimea este vidă&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // is_empty_set(s) - verifica daca multimea este sau nu goala&lt;br /&gt;
  // returneaza 1 daca este, 0 daca nu este&lt;br /&gt;
  int is_empty_set(char s[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      if (s[i])&lt;br /&gt;
        return 0;&lt;br /&gt;
    return 1;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* o funcție care să citească de la tastatură o mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // read_set(s) - functia citeste numarul n de elemente care se afla in s&lt;br /&gt;
  // apoi citeste cele n numere si le insereaza in a&lt;br /&gt;
  // va returna numarul n citit (numarul de elemente)&lt;br /&gt;
  int read_set(char s[SIZE]) {&lt;br /&gt;
    int n;&lt;br /&gt;
    scanf(&amp;quot;%d&amp;quot;, &amp;amp;n);&lt;br /&gt;
    for (int i = 0; i &amp;lt; n; ++i) {&lt;br /&gt;
      int num;&lt;br /&gt;
      scanf(&amp;quot;%d&amp;quot;, &amp;amp;num);&lt;br /&gt;
      insert_in_set(s, num);&lt;br /&gt;
    }&lt;br /&gt;
    return n;&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* o funcție care să afișeze pe ecran elementele care se află într-o mulțime&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // print_set(s) - functia printeaza elementele multimii s&lt;br /&gt;
  void print_set(char s[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; (SIZE &amp;lt;&amp;lt; LOG_BYTE); ++i)&lt;br /&gt;
      if (is_in_set(s, i))&lt;br /&gt;
        printf(&amp;quot;%d\n&amp;quot;, i);&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Sarcina 2 ===&lt;br /&gt;
Realizati un program care, utilizând metodele de fite anterior, citește 2 mulțimi A (n și B și a fișează: &lt;br /&gt;
AUB,A∩B,A−B,B−A&lt;br /&gt;
AUB,A∩B,A−B,B−A&lt;br /&gt;
. &lt;br /&gt;
Pentru a realiza acest lucru, va trebui să implementați următoarele funcții: &lt;br /&gt;
* reuniunea a două mulțimi (1p)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // c = a U b&lt;br /&gt;
  void merge_set(char a[SIZE], char b[SIZE], char c[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      c[i] = (a[i] | b[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* intersecția a două mulțimi (1p)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // c = a n b&lt;br /&gt;
  void intersect_set(char a[SIZE], char b[SIZE], char c[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      c[i] = (a[i] &amp;amp; b[i]);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
* diferența a două mulțimi (1p)&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
  // c = a \ b&lt;br /&gt;
  void diff_set(char a[SIZE], char b[SIZE], char c[SIZE]) {&lt;br /&gt;
    for (int i = 0; i &amp;lt; SIZE; ++i)&lt;br /&gt;
      c[i] = (a[i] ^ (a[i] &amp;amp; b[i]));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
În final va trebui sa creați o funcție main și să faceți un program care rezolvă cerința folosind funcțiile implementate.&lt;br /&gt;
&lt;br /&gt;
==Lista de probleme==&lt;br /&gt;
Probleme rezolvate:&lt;br /&gt;
&lt;br /&gt;
http://www.infoarena.ro/operatii-pe-biti&lt;br /&gt;
http://campion.edu.ro/arhiva/www/arhiva_2009/papers/paper21.pdf&lt;br /&gt;
&lt;br /&gt;
Tema 5&lt;br /&gt;
* [http://varena.ro/problema/laborator laborator]&lt;br /&gt;
* [http://varena.ro/problema/suc1 suc1] Propunere David&lt;br /&gt;
* [http://varena.ro/problema/colectie1 colectie1]&lt;br /&gt;
Infoarena&lt;br /&gt;
* [http://infoarena.ro/problema/clasic clasic] Propunere David&lt;br /&gt;
* [http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=1065 xor1] Propunere David&lt;br /&gt;
* http://campion.edu.ro/arhiva/index.php?page=problem&amp;amp;action=view&amp;amp;id=404 sets&lt;br /&gt;
&lt;br /&gt;
= Tema = &lt;br /&gt;
* [http://varena.ro/problema/2b1 2b1]  Olimpiada pe scoala 2015 clasa a 6-a [http://isa.algopedia.ro/wiki/index.php/2b1 Rez]&lt;br /&gt;
* [http://varena.ro/problema/suprapuneri suprapuneri] Cerc informatică Vianu [http://isa.algopedia.ro/wiki/index.php/suprapuneri Rez]&lt;br /&gt;
* [http://varena.ro/problema/monsters monsters] Cerc informatică Vianu [http://isa.algopedia.ro/wiki/index.php/monsterd Rez]&lt;br /&gt;
* [http://varena.ro/problema/ploaie1 ploaie1]&lt;br /&gt;
* [https://www.pbinfo.ro/probleme/2931/parap parap] Infooltenia 2019&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Cerc_6_2018&amp;diff=17476</id>
		<title>Cerc 6 2018</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Cerc_6_2018&amp;diff=17476"/>
		<updated>2020-02-28T23:50:36Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_33&amp;diff=17456</id>
		<title>Clasa a IX-a lecția 33</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Clasa_a_IX-a_lec%C8%9Bia_33&amp;diff=17456"/>
		<updated>2020-02-26T14:54:46Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
	<entry>
		<id>https://www.algopedia.ro/wiki/index.php?title=Test_BFS&amp;diff=17454</id>
		<title>Test BFS</title>
		<link rel="alternate" type="text/html" href="https://www.algopedia.ro/wiki/index.php?title=Test_BFS&amp;diff=17454"/>
		<updated>2020-02-24T10:26:36Z</updated>

		<summary type="html">&lt;p&gt;Bella: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Bella</name></author>
	</entry>
</feed>