-
Notifications
You must be signed in to change notification settings - Fork 118
/
perfectNumbers.c
115 lines (90 loc) · 3.03 KB
/
perfectNumbers.c
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
/**
* Algorithms to show, return and check if a number is a
* Perfect Number. A perfect number, sum(n) == n (excludeing n)
* is the summation of n's divisors, is a number whos even
* divisors sum to the number (n). The number (n) is not
* included in the summation.
* These algorithsm are unable to calculate past the 5th
* perfect number as such a number exceedes the size of a
* int integer.
* Calculations above the 4th perfect number (8132)
* not reccommended.
*/
#include <stdio.h>
// Function definitions
void printPerfects(int, int);
int checkIfPerfect(int); // Requires a positive number greater than 1.
void nthPerfectNumber(int);
int main() {
// Code to show results of functions
printPerfects(0, 10000);
puts("");
int isItPerfect = 33550336;
int perfectNumber = checkIfPerfect(isItPerfect);
if (perfectNumber)
printf("%i is Perfect\n", isItPerfect);
else
printf("%i is not Perfect\n", isItPerfect);
puts("");
isItPerfect = 33550335;
perfectNumber = checkIfPerfect(isItPerfect);
if (perfectNumber)
printf("%i is Perfect\n", isItPerfect);
else
printf("%i is not Perfect\n", isItPerfect);
puts("");
nthPerfectNumber(4);
return 0;
}
/**
* Prints all perfect number from start to stop
*/
void printPerfects(int start, int stop) {
// Iterate form star to stopt
while (start <= stop) {
// Set divisors summation value to 0
int divisors = 0;
// Check for perfect divisors, add to divisors if found
// Stop half way to current start value as no perfect
// divisors exist past the half of start value
for (int i = 1; i <= (start / 2) + 1; ++i)
divisors += (start % i == 0) ? i : 0;
// Check if divisors sum is equal to the start value
// print if it is true.
// By definition perfect numbers are greater than 1.
if ((divisors == start) && (start > 1))
printf("%i is Perfect\n", start);
// Goto the next number
++start;
}
}
/**
* Checks if the passed number is a perfect number
* returns 1 if true 0 if false
*/
int checkIfPerfect(int n) {
// Set divisors summation to 0
int divisors = 0;
// Iterate through all possible perfect divisors.
// Check if it is a perfect divisor.
// Add the divisor to divisor variable if it is perfect.
// Stop half was to the passed number as there are no
// perfect divisors beyond this point.
for (int i = 1; i <= (n / 2) + 1; ++i)
divisors += (n % i == 0) ? i : 0;
// return 1 if perfect else return 0
return (divisors == n) ? 1 : 0;
}
void nthPerfectNumber(int n) {
int numPerfectNums = 0;
int checkNum = 0;
while (numPerfectNums < n) {
int divisors = 0;
++checkNum;
for (int i = 1; i <= (checkNum / 2) + 1; ++i)
divisors += (checkNum % i == 0) ? i : 0;
if ((divisors == checkNum) && (checkNum > 1))
++numPerfectNums;
}
printf("The %i-th perfect number is %i\n", n, checkNum);
}