我正在尝试实现一个程序,该程序从用户那里读取一个正整数并输出 2 和userNum
. 它还输出介于 2 和 之间的所有友好数字对userNum
。两个数字都必须在范围内。我正在为此苦苦挣扎。
要求:
1) 调用AnalyzeDivisors
必须保持在 theta(userNum) 次。2) 函数void AnalyzeDivisors
必须采用以下参数int num, int& outCountDivs, int& outSumDivs
。3) 函数bool IsPerfect
必须采用以下参数int num
。
老实说,我不知道如何在该效率范围内做到这一点。我目前能够通过将规则弯曲到 IsPerfect 函数的参数来确定该范围内的所有完美数字,但是如何确定友好对而不需要在 main 中的 for 循环的每次迭代中调用Analyze Dividors 过多的次数?
任何帮助将不胜感激!下面的代码:
主要的
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;
}
分析除数
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;
}