Clasa a V-a lecția 6 S7

From Algopedia
Jump to navigationJump to search

Tema6 Rezolvari

  • (usoara) 2 la n :Sa se calculeze 2 la puterea n.
  • (usoara) Eliminarea primei cifre: Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.
  • (medie) Extragere cifre pare : Se citeste un numar n, de maxim 9 cifre dintr-un fisier "date.in". Afisati numarul care contine, in aceeasi ordine doar cifrele pare ale lui n, intr-un fisier "date.out". Ex: n= 12345, Se va afisa 24;
  • (medie) Cifra de control: 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. Ex: n=193, s=1+9+3=13, s=1+3=4
  • (dificila - optional) Numere palindrom apropiate de n: Se citeste un numar n. Sa se afiseze cel mai apropiat fata de n numar palindrom.

Ex1: 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122. Ex2: 452 , afisam 454; nr 452 este cuprins intre 444 si 454.

2 la n

#include <stdio.h>

int main() {
  int n, contor;

  scanf( "%d", &n );
  contor = 0; 
  p = 1;
  while (  contor < n ) {
    p = p * 2;
    contor= contor + 1;
  }
  printf( "%d ", p );
  return 0;
}

Extragere cifre pare din n

  • 2. Se citeste un numar n, de maxim 9 cifre dintr-un fisier "date.in". Afisati numarul care contine, in aceeasi ordine doar cifrele pare ale lui n, intr-un fisier "date.out". Ex: n= 12345, Se va afisa 24;

Varianta1

#include <stdio.h>

int main() {
  int n, p, ucif, nr;

  ///citim numarul n ca numar intreg
  scanf( "%d", &n );

  p = 1;
  nr = 0;               /// nr pe care il construim adaugand doar cifrele pare
  while ( n > 0 ){
    ucif = n % 10;          /// extragem ultima cifra a lui n
    if ( ucif % 2 == 0){    /// daca cifra este para
      nr = ucif * p + nr;   /// adaugam cifra para in fata numarului nr
      p = p * 10;           /// calculam puterea cu care trebuie sa inmultim la pasul urmator
    }
    n = n / 10;             /// taiem ultima cifra din n
  }

  printf( "%d", nr );
  return 0;
}

Varianta2

#include <stdio.h>

int main(){
  int n, p, nr, pcif;
  FILE *fin = fopen("date.in", "r");     /// r de la read
  FILE *fout = fopen ("date.out", "w");  /// w de la write
  /// cititm n din fisierul de intrare
  fscanf(fin,"%d", &n);

  ///calculeaza puterea lui 10 care aproximeaza pe n ( mai mica sau egala cu n)
  p = 100000000;
  while ( p > n )
    p = p / 10;

  ///construiesc numarul cerut parcurgand cifrele incepand de la prima cifra a sa
  nr = 0;
  while ( p > 0 ){        /// ATENTIE! n>0 CA NU MERGE PT NUMERE CU ZEROURI LA COADA
    pcif = n / p;         /// extrag prima cifra din n
    if ( pcif % 2 == 0)   /// daca cifra este para
      nr = nr * 10 + pcif;/// adaug cifra la coada lui nr
    n = n % p;            /// scot prima cifra din n
    p = p / 10;           /// ajustez puterea lui 10
  }

  ///afisam nr in fisierul; de iesire
  fprintf(fout, "%d", nr);
  fclose(fin);
  fclose(fout);
  return 0;
}

Eliminarea primei cifre

Se citeste un numar n. Afisati numarul rezultat prin eliminarea primei cifre a lui n.

Varianta1

Vom construi un numar nou, adaugand la noul numar toate cifrele lui n, mai putin prima cifra.

Pseudocod C/C++
integer n, p, x;
read n;
p ← 1;
x ← 0;
while (n > 9) do
  x ← (n mod 10) * p + x;  
  p ← p * 10;
  n ← n div 10;
write x;
#include <iostream>
using namespace std;
int main(){
  int n, p, x;
  cout << "Dati un numar n:" << endl;
  cin >> n;
  p = 1;
  x = 0;
  while (n > 9){
    x = (n % 10) * p + x;
    p = p * 10;
    n = n / 10;
  }
  cout << "Numarul rezultat este: " << x;
  return 0;
}

Varianta2

Vom calcula puterea lui 10 la care trebuie sa impartim numarul astfel incat sa eliminam prima cifra.

Pseudocod C/C++
 integer n, p;
 read n;
 p = 1000000000;
 while(p>n)
   p = p / 10;
 write n % p;
#include <iostream>
using namespace std;
int main(){
  int n, p;
  cin >> n;
  p = 1000000000;
  while(p>n)
    p = p / 10;
  cout << n % p;
  return 0;
}

Cifra de control

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. Ex: n=193 s=1+9+3=13 s=1+3=4
Rezolvare: Vom calcula mai intai suma cifrelor lui n. Daca suma cifrelor are mai mult de o cifra, atunci copiem valoarea sumei in n si reluam calculul sumei cifrelor, de data aceasta pentru numarul obtinut prin adunarea cifrelor. Vom repeta procedeul pana cand obtinem un numar cu o singura cifra.

#include <iostream>
using namespace std;
int main(){
  int n, s;
  cout << "Dati un numar n:" << endl;
  cin >> n;
  //calculam suma cifrelor
  s = 0;
    while( n > 0 ){
      s = s + n % 10;
      n = n / 10;
    }
  while( s > 9 ){
    n = s;
    while( n > 0 ){
      s = s + n % 10;
      n = n / 10;
    }
  }
  cout << "Cifra de control este " << s;
  return 0;
}

Numere palindrom apropiate de n

Varianta1: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n, diferit de n.
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122
Ex2: n = 121 , afisam 111 131; 111, 131 sunt la aceeasi distanta fata de n
Ex3: n = 247 , afisam 242 252; 242, 252 sunt la aceeasi distanta fata de n

#include <iostream>
using namespace std;
int main(){
    int n, cn1, cn2, c1, c2, palin1, palin2, inv;
    cin>>n;               //citim n
    cn1=n-1;
    cn2=n+1;
    palin1 = palin2 = -1;                   //nu le-am gasit inca
    while (palin1 == -1 && palin2 == -1){   //inca nu le-am gasit
      //verific daca cn1 e palindrom
      c1=cn1;
      inv = 0;
      while (c1 > 0){
        inv = inv * 10 + c1 % 10;
        c1 = c1 /10; //div
      }
      if (cn1 == inv ){
        palin1 = cn1;
      }
      //verific daca cn2 e palindrom
      c2=cn2;
      inv = 0;
      while (c2 > 0){
        inv = inv * 10 + c2 % 10;
        c2 = c2 /10; //div
      }
      if (cn2 == inv ){
        palin2 =cn2;
      }
      cn1 = cn1-1;
      cn2 = cn2+1;
    }
    if (palin1!=-1 && palin2!=-1)   //cand am gasit 2 la aceeasi distanta
      cout<<palin1<<palin2;
    else if (palin1!=-1)            //daca am gasit doar pe palin1
      cout<<palin1;
    else
      cout<<palin2;

    return 0;
}

Varianta2: Se citeste un numar n. Sa se afiseze cel mai apropiat numar palindrom fata de n.
Ex1: n = 122 , afisam 121; nr 122 e cuprins intre 121 si 131, iar 121 este mai apropiat fata de 122
Ex2: n = 121 , afisam 121
Ex3: n = 247 , afisam 242 252; 242 si 252 sunt la aceeasi distanta fata de n

#include <iostream>
using namespace std;
int main(){
    int n, cn1, cn2, c1, c2, palin1, palin2, inv;
    cin>>n;               //citim n
    cn1=n;
    cn2=n;
    palin1 = palin2 = -1;                   //nu le-am gasit inca
    while (palin1 == -1 && palin2 == -1){   //inca nu le-am gasit
      //verific daca cn1 e palindrom
      c1=cn1;
      inv = 0;
      while (c1 > 0){
        inv = inv * 10 + c1 % 10;
        c1 = c1 /10; //div
      }
      if (cn1 == inv ){
        palin1 = cn1;
      }
      //verific daca cn2 e palindrom
      c2=cn2;
      inv = 0;
      while (c2 > 0){
        inv = inv * 10 + c2 % 10;
        c2 = c2 /10; //div
      }
      if (cn2 == inv ){
        palin2 =cn2;
      }
      cn1 = cn1-1;
      cn2 = cn2+1;
    }
    if (palin1!=-1 && palin2!=-1){   //cand am gasit 2 la aceeasi distanta
      if(palin1 == palin2)           //cand 
        cout<<palin1;
      else
      cout<<palin1<<" "<<palin2;
    }
      
    else if (palin1!=-1)            //daca am gasit doar pe palin1
      cout<<palin1;
    else
      cout<<palin2;

    return 0;
}

Test

Test din pbinfo:

Tema7

Alegeti 3 probleme din runda:

Incercati sa rezolvati acasa problemele din test:

  • S7 Problemele din test

Optional: Rezolvati si celelalte 3 probleme din runda din varena