Определите дружественные пары в пределах границ тэты (n)

Я пытаюсь реализовать программу, которая читает положительное целое число от пользователя и выводит все идеальные числа от 2 до userNum, Он также выводит все пары дружных чисел, которые находятся между 2 и userNum, Оба числа должны быть в пределах диапазона. Я серьезно борюсь с этим.

Требования:
1) звонки на AnalyzeDivisors должны храниться в тета (userNum) раз все вместе. 2) Функция void AnalyzeDivisors должны принять следующие аргументы int num, int& outCountDivs, int& outSumDivs, 3) Функция bool IsPerfect должен принять следующий аргумент int num,

Честно говоря, я не знаю, как это сделать в этом диапазоне эффективности. В настоящее время я могу определить все идеальные числа в диапазоне, изгибая правила до параметров функции IsPerfect, но как я могу определить дружные пары, не вызывая Analyze Dividors непомерное количество раз на каждую итерацию цикла for в main? ?

Любая помощь будет принята с благодарностью! Код ниже:

главный

int main()
{
int userNum;

//Request number input from the user
cout << "Please input a positive integer num (>= 2): " << endl;
cin >> userNum;

for (int counter = 2; counter <= userNum; counter++)
{
//Set variables
int outCountDivs = 0, outSumDivs = 0, otherAmicablePair = 0;
bool perfectNum = false, isAmicablePair = false;

//Analyze dividors
AnalyzeDividors(counter, outCountDivs, outSumDivs);

//determine perfect num
perfectNum = IsPerfect(counter, outSumDivs);

if (perfectNum)
cout << endl << counter << IS_PERFECT_NUM;

}

return 0;
}

AnalyzeDividors

void AnalyzeDividors(int num, int& outCountDivs, int& outSumDivs)
{
int divisorCounter;

for (divisorCounter = 1; divisorCounter <= sqrt(num); divisorCounter++)
{
if (num % divisorCounter == 0 && num / divisorCounter != divisorCounter && num / divisorCounter != num)
{
//both counter and num/divisorCounter
outSumDivs += divisorCounter + (num / divisorCounter);
outCountDivs += 2;
}

else if ((num % divisorCounter == 0 && num / divisorCounter == divisorCounter) || num/divisorCounter == num)
{
//Just divisorCounter
outSumDivs += divisorCounter;
outCountDivs += 1;
}
}
}

Идеально

bool IsPerfect(int userNum, int outSumDivs)
{

if (userNum == outSumDivs)
return true;
else
return false;

}

0

Решение

Я думаю, что нашел решение, которое соответствует требованиям. Я нашел дружественные числа, храня каждое число и сумму делителей на карте. Если на карте введена сумма делителей числа, а сумма делителей суммы делителей была текущим числом, то они являются дружественными.

Поскольку результаты сохраняются каждый раз, вы звоните только AnalyzeDivisors один раз за номер.

Простите за ленивое именование переменных.

#include <iostream>
#include <map>
#include <cmath>

void AnalyzeDivisors(int num, int& divc, int &divs)
{
divc = 1;
divs = 1;
for (int x = 2, y = std::sqrt(num); x <= y; ++x)
{
if (num % x == 0)
{
++divc;
divs += x;
if (num / x != x)
{
++divc;
divs += num / x;
}
}
}
}

bool IsPerfect(int num)
{
static std::map<int, int> amicable;
int divc = 0, divs = 0;
AnalyzeDivisors(num, divc, divs);
if (amicable.find(divs) != amicable.end() && amicable[divs] == num)
std::cout << num << " and " << divs << " are best bros for life.\n";
amicable[num] = divs;
return num == divs;
}

int main()
{
int num;
std::cout << "Pick a number: ";
std::cin >> num;
for (int x = 2; x < num; ++x)
{
if (IsPerfect(x))
std::cout << x << " is perfect in every way!\n";
}
}
1

Другие решения

Других решений пока нет …