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
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;
}
}