此代码将计算给定数字的所有除数之和。它运行得很好,我的问题是:我可以进一步优化它,是否有更好的算法?
以下是代码:
#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而反之亦然。