Informatică, întrebare adresată de DugleMugleNugget, 8 ani în urmă

FOARTE URGENT!!! 40 DE PUNCTE!!!!

Se citesc din DATE.IN exact N nr naturale, separate cu spatii. Sa se afiseze in DATE.OUT, fiecare nr. citit, urmat de suma divizorilor sai proprii, respectiv de mesajul "NU e perfect".

Răspunsuri la întrebare

Răspuns de Paddon
0

Am presupus ca nu stii cat e acel N. Daca stii, foloseste citeste-l si inlocuieste "while (fin >> n)" cu "for (int i = 0; i < N; ++i)"

Am incercat sa-l optimizez, dar si sa fie usor de inteles.

#include <iostream>

#include <fstream>

using namespace std;

bool is_prime(int number)

{

if (number <= 1)

 return false;

if (number == 2)

 return true;

if (number % 2 == 0)

 return false;

int divisor = 3;

while (divisor * divisor <= number)

{

 if (number % divisor == 0)

  return false;

 divisor += 2;

}

return true;

}

int main()

{

ifstream fin("DATE.IN");

ofstream fout("DATE.OUT");

int numar;

while (fin >> numar)

{

 int suma = 0;

 if (is_prime(numar))

  fout << numar << " nu este perfect";

 else if (numar % 2 == 0)

 {

  int divizor = 2;

  while (divizor * divizor < numar)

  {

   if (numar % divizor == 0)

    suma = suma + divizor + (numar / divizor);

   ++divizor;

  }

  if (divizor * divizor == numar)

   suma += divizor;

  fout << numar << " " << suma;

 }

 else

 {

  int divizor = 3;

  if (numar == 1)

   suma = 1;

  else

  {

   while (divizor * divizor < numar)

   {

    if (numar % divizor == 0)

     suma = suma + divizor + (numar / divizor);

    divizor += 2;

   }

   if (divizor * divizor == numar)

    suma += divizor;

  }

  fout << numar << " " << suma;

 }

 fout << endl;

}

}

Alte întrebări interesante