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

Numere prietene: Două numere a şi b se numesc prietene dacă a este egal cu suma

divizorilor lui b (fără b) şi b este egal cu suma divizorilor lui a (fără a). Scrieţi un

program care să determine primele k perechi de numere prietene cu a

#include


int sumaDiv(int numar)

{

int i = 2,suma=0;

for (i = 2; i <= numar / 2; i++)

{

if (numar%i == 0)

{

suma += i;

}

}

return suma;

}

void perechi(int k)

{

int index = 0;

int i, j;


for ( i = 1; i
for ( j = 2; j <= 2147483647; j++)

{

if (i==sumaDiv(j) && j==sumaDiv(i))

{

std::cout << "[" << i << "," << j << "]" << std::endl;

if (index == k)

{

break;

break;

}

index++;


}

}

}

}

int main()

{

int k;

std::cout << "Cate perechi doriti?\n";

std::cin >> k;

perechi(k);

return 0;


}


Problema este ca nu stiu care este intervalul ci doar cate perechi trebuie sa aflu si nu stiu cum le-as putea gasi intr-un mod mai eficient. Programul mi se blocheaza si in debugger de altfel. For-ul ce merge pana la limita la tipul de date int este problema dar nu stiu cum sa scriu partea aia altcumva.

Nu este o tema sau ceva de genul, mi-a trimis un prieten de la facultate o lista de probleme


boiustef: La orice problemă se dau restricţii la valorile mărimilor... altfel nu e bine.
nu crecetezi şi 1 ca divizor?

Răspunsuri la întrebare

Răspuns de boiustef
0

Răspuns:

long long sumadiv(int x)

{

   long long sd=1, d;

   for (d=2; d*d<x; ++d)

    {

      if (x%d==0)

       { sd+=d; sd+=x/d; }

    }

    if (d*d==x) sd+=d;

    return sd;

}

Explicație:

Îţi propun o metodă mai efectivă pentru a determina suma divizorilor.

Întradevăr indicele lui for, (adică numărul de repetări) nu poate fi foarte foarte mare.. Poţi experimenta să vezi ...

Enunţul spune că cauţi perechi prietene cu a, deci trebuie să-l citeşti pe a, să+i afli suma divizorilor şi cu un singur for să cauţi numerele b.

Alte întrebări interesante