0

我正在尝试实现一个程序,该程序从用户那里读取一个正整数并输出 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;

}
4

1 回答 1

1

我想我找到了一个符合要求的解决方案。通过将每个数字和除数之和存储在地图中,我找到了友好的数字。如果在map中输入了一个数的因数之和,并且除数之和是当前数,那么它们是友好的。

因为每次都会保存结果,所以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";
    }
}
于 2017-02-24T04:06:00.170 回答