Difference between revisions of "Clasa a V-a lecția 8 - 12 oct 2019"

From Algopedia
Jump to: navigation, search
(Created page with "= Tema - rezolvări = == Algoritmi (scheme logice + programe C) == * Calculați x<sup>11</sup> cu număr minim de înmulțiri: Care este numărul minim? '''Răspuns''': numă...")
(No difference)

Revision as of 16:05, 7 October 2019

Tema - rezolvări

Algoritmi (scheme logice + programe C)

  • Calculați x11 cu număr minim de înmulțiri: Care este numărul minim?

Răspuns: numărul minim de înmulțiri este 5. Demonstrați că nu puteți rezolva problema cu 4 înmulțiri. O posibilitate de calcul este:

x11 cu număr minim de înmulțiri
#include <stdio.h>
int main() {
  int x, x2, x4, x8, x11;

  scanf( "%d", &x );
  x2 = x * x;
  x4 = x2 * x2;
  x8 = x4 * x4;
  x11 = x8 * x2 * x;
  printf( "%d la puterea 11 = %d\n", x, x11 );

  return 0;
}
  • Se citește un număr n. Să se spună cîte cifre pare are el. Exemple: dacă n=3528 el are 2 cifre pare (2 și 8), dacă n=49285640 el are 6 cifre pare (4, 2, 8, 6, 4, 0).

Răspuns 1:

Cîte cifre pare are numărul n
#include <stdio.h>

int main() {
  int n, c, nrp;

  scanf( "%d", &n );
  nrp = 0;
  while ( n > 0 ) {
    c = n % 10;
    n = n / 10;
    if ( c % 2 == 0 )
      nrp = nrp + 1;
  }
  printf( "Nr. cifre pare: %d\n", nrp );

  return 0;
}

Răspuns 2: Putem simplifica această soluție? Iată ce putem face:

  1. Precum am mai discutat mai demult, n % 10 % 2 este totuna cu n % 2. Deci testul c % 2 == 0 poate fi înlocuit cu n % 2 == 0, scutind un calcul și o variabilă. Pentru aceasta trebuie să facem testul înainte de a îl împărți pe n la 10.
  2. Ce valori poate lua restul împărțirii la 2? Zero sau unu. Cînd adunăm 1 la nrp? Atunci cînd restul este 0. Atunci cînd restul este unu nu adunăm nimic la nrp, ceea ce este totuna cu a aduna zero. Cu alte cuvinte putem întotdeauna să adunăm negarea restului. Cum calculăm acest număr? El este 1 - rest.

Iată o soluție bazată pe aceste două simplificări:

Cîte cifre pare are numărul n varianta 2
#include <stdio.h>

int main() {
  int n, nrp;

  scanf( "%d", &n );
  nrp = 0;
  while ( n > 0 ) {
    nrp = nrp + 1 - n % 2;
    n = n / 10;
  }
  printf( "Nr. cifre pare: %d\n", nrp );

  return 0;
}
  • Se citește un număr n. Să se afișeze cel mai mare divizor propriu al lui n (strict mai mic decît n). Exemplu: dacă n=24 cel mai mare divizor propriu este 12. Dacă n=7 cel mai mare divizor propriu este 1. Dacă n=125 cel mai mare divizor propriu este 25. Dacă n=175 cel mai mare divizor propriu este 35.

Răspuns:

Cel mai mare divizor propriu al lui n
#include <stdio.h>

int main() {
  int n, d;

  scanf( "%d", &n );
  d = n - 1;
  while ( n % d > 0 )
    d = d - 1;
  printf( "Cel mai mare divizor propriu: %d\n", d );
  return 0;
}

Problemă de logică

Filozoful Immanuel Kant a ajuns acasă unde a constatat că ceasul de perete a stat deoarece a uitat să-l întoarcă. El a plecat către prietenul lui bun. Acolo a stat o vreme la discuții filozofice, apoi s-a întors înapoi acasă unde a potrivit ceasul la ora exactă! Cum a procedat Kant? Se știe că:

  • Prietenul lui Kant are un ceas care merge bine
  • Pe vremea lui Kant nu existau ceasuri de mînă sau alte dispozitive mobile cu ceas
  • Kant merge cu viteză constantă, de ani de zile aceeași.

Răspuns: Kant a pornit ceasul de acasă și l-a pus pe o oră oarecare, să-i spunem h1 . Apoi a plecat la prietenul său, unde și-a notat timpul, să-i spunem h2. Înainte să plece și-a notat din nou timpul, să-i spunem h3. Cînd a ajuns acasă ceasul său arăta h4. Diferența h4 – h1 este timpul cît a fost plecat. Diferența h3 – h2 este timpul cît a stat la prietenul său. (h4 – h1) – (h3 – h2) este timpul pe care l-a făcut pe drum, dus-întors. Jumate din acest timp l-a făcut la întoarcere. Adunînd la timpul de plecare de la prietenul său timpul de întoarcere Kant a aflat ora exactă h = h3 + [(h4 – h1) – (h3 – h2)] / 2.