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
Răspunsuri la întrebare
Răspuns de
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
Religie,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Matematică,
8 ani în urmă
Chimie,
8 ani în urmă
Matematică,
9 ani în urmă
Limba română,
9 ani în urmă
Matematică,
9 ani în urmă
nu crecetezi şi 1 ca divizor?