所有除数的总和:优化此代码的任何方法?

时间:2017-07-28 15:57:24

标签: c++ algorithm

此代码将计算给定数字的所有除数之和。它运行得很好,我的问题是:我可以进一步优化它,是否有更好的算法?

以下是代码:

#include <iostream>
#include <chrono>
#include <cmath>

using namespace std;
using namespace chrono;

typedef high_resolution_clock hr_clock;

void friendNumbers(int max);
inline int sumOfDivisors(int* n);

int main()
{
    auto max = 0;
    cout << "Please enter the maximum Number: " << endl;
    cin >> max;

    hr_clock::time_point t1 = hr_clock::now();
    friendNumbers(max);
    hr_clock::time_point t2 = hr_clock::now();

    auto duration = duration_cast<milliseconds>(t2 - t1).count();
    cout << "The program took " << duration << " milliseconds to complete." << endl;
}

//Here I check, if sum1 and sum2 are friend numbers
//(explanation beneath) and print them out
void friendNumbers(int max)
{   
    std::ios::sync_with_stdio(false);
    for(int i = 2; i != max; ++i) {
        auto sum1 = sumOfDivisors(&i);
        if(i < sum1) continue;
        auto sum2 = sumOfDivisors(&sum1);
        if(i == sum2 && sum1 != sum2) {
            cout << sum1 << " | " << sum2 << endl;
        }
    }
}

//This function returns the sum of divisors of n
inline int sumOfDivisors(int* n)
{
    auto sum = 1;
    auto border = round(sqrt(*n)+1);
    for(int i = 2; i < border; ++i)
        if(*n % i == 0 && i*i != *n)
            sum += i + (*n / i);
    return sum;
}

使用除数之和计算朋友数,例如。 220和284因为220的所有除数的总和等于284而反之亦然。

0 个答案:

没有答案