Clasa a V-a lecția 6 S8

From Algopedia
Jump to navigationJump to search

Lectie

Divizorii unui numar

Afisarea divizorilor unui numar in ordine crescatoare

Varianta1:

#include <stdio.h>
int main() {
 int n, d;
 scanf( "%d", &n );
 printf( "Divizorii lui %d sunt:", n );
 d = 1;
 while ( d <= n ) {
   if ( n % d == 0 )
     printf( " %d", d );
   d = d + 1;
 }
 printf( "\n" );
 return 0;
}

Varianta2 optimizat:

#include <stdio.h>
#include <math.h>
int main() {
  int n, d;
  scanf( "%d", &n );
  printf( "Divizorii lui %d sunt:", n );
  //afisam intai divizorii mai mici strict decat sqrt( n )
  d = 1;
  while ( d * d <= n ) {
    if ( n % d == 0 )
      printf( "%d ", d );
    d = d + 1;
 }
 d = sqrt( n );
 while ( d * d >= 1 ) {
   if ( n % d == 0 )
     printf( "%d ", n / d );
   d = d - 1;
 }
 printf( "\n" );
 return 0;
}

Suma tuturor divizorilor unui numar

#include <stdio.h>
int main(){
  long long n, s, d;

  scanf("%lld", &n);
  s = 0;
  d = 1;
  while( d * d < n ){      // ne oprim cu d pana in radicalul numarului n
    if( n % d == 0 )
      s = s + d + n / d;   // adaugam la suma si pe d si perechea sa de dupa radical
    d = d + 1;    
  }

  // aici d va fi fie egal cu radical din n daca n e patrat perfect, fie mai mare decat radical din n

  if( d * d == n )         // daca n e patrat perfect, 
    s = s + d;             // vom adauga radical din n doar o data la suma
  printf("%lld\n", s);
  return 0;
}

Primalitate

#include <stdio.h>
int main() {
 int n, d;
 scanf( "%d", &n );
 d = 2;
 while ( d * d <= n && n % d > 0 )
   d = d + 1;
 if ( d * d > n && n > 1 )
   printf( "%d este prim\n", n );
 else
   printf( "%d nu este prim\n", n );
 return 0;
}

Test2

Test in pbinfo

Probleme

Divizorii unui numar:

Primalitate

Tema8 (Optionala)

  • Rezolvati problemele din test
  • Implementati problemele care v-au ramas nerezolvate din lista de mai sus
  • Tema de halloween de groaza este doar pentru cei foarte avansati, ar trebui sa va ia o luna sa o terminati.