-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProblem 21.cpp
More file actions
83 lines (68 loc) · 2.25 KB
/
Copy pathProblem 21.cpp
File metadata and controls
83 lines (68 loc) · 2.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include <iostream>
#include <vector>
bool IsProperDivisor(long number, long divisor) { return number % divisor == 0; }
struct NumProperDivisors {
unsigned short number;
std::vector<unsigned short> properDivisors;
std::size_t sumOfProperDivisors = 0;
};
bool operator!=(NumProperDivisors &npd1, NumProperDivisors &npd2) { return npd1.number != npd2.number || npd1.properDivisors != npd2.properDivisors || npd1.sumOfProperDivisors != npd2.sumOfProperDivisors; }
std::ostream& operator<<(std::ostream& os, NumProperDivisors& npd) {
os << "Number: " << npd.number << '\n';
os << "Proper Divisors: ";
for(auto num : npd.properDivisors) {
os << num << ' ';
}
os << "\nSum of Proper Divisors: " << npd.sumOfProperDivisors << '\n';
return os;
}
std::vector<NumProperDivisors> amicableNumbers;
std::vector<NumProperDivisors> Nums;
std::size_t sumOfAmicableNumbers = 0;
void calc(NumProperDivisors& npd) {
for(unsigned short divisor = 1; divisor < npd.number; divisor++) {
if(IsProperDivisor(npd.number, divisor)) {
npd.properDivisors.push_back(divisor);
}
}
for(auto num : npd.properDivisors) {
npd.sumOfProperDivisors += num;
}
}
bool alreadyCalculated(unsigned short number) {
for(unsigned short i = 0; i < amicableNumbers.size(); i++) {
if(number == amicableNumbers[i].number) {
return true;
}
}
return false;
}
int main() {
NumProperDivisors actualNumber;
NumProperDivisors lastNumber;
for(unsigned short number = 0; number < 10'000; number++) {
if(alreadyCalculated(number)) {
continue;
}
actualNumber.number = number;
calc(actualNumber);
lastNumber = actualNumber;
actualNumber = NumProperDivisors();
actualNumber.number = lastNumber.sumOfProperDivisors;
calc(actualNumber);
if(actualNumber.sumOfProperDivisors == lastNumber.number && lastNumber.number != actualNumber.number) {
amicableNumbers.push_back(lastNumber);
amicableNumbers.push_back(actualNumber);
}
actualNumber = NumProperDivisors();
}
std::cout << "amicable Numbers: ";
for(unsigned short i = 0; i < amicableNumbers.size(); i++) {
std::cout << amicableNumbers[i] << '\n';
}
for(NumProperDivisors npd : amicableNumbers) {
sumOfAmicableNumbers += npd.number;
}
std::cout << "Sum of Amicable Numbers: " << sumOfAmicableNumbers << '\n';
return 0;
}