TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
gcd_of_n_numbers.cpp File Reference

This program aims at calculating the GCD of n numbers. More...

#include <algorithm>
#include <array>
#include <cassert>
#include <iostream>
Include dependency graph for gcd_of_n_numbers.cpp:

Go to the source code of this file.

Namespaces

namespace  math
 for assert
 
namespace  gcd_of_n_numbers
 Compute GCD of numbers in an array.
 

Functions

int math::gcd_of_n_numbers::gcd_two (int x, int y)
 Function to compute GCD of 2 numbers x and y.
 
template<std::size_t n>
bool math::gcd_of_n_numbers::check_all_zeros (const std::array< int, n > &a)
 Function to check if all elements in the array are 0.
 
template<std::size_t n>
int math::gcd_of_n_numbers::gcd (const std::array< int, n > &a)
 Main program to compute GCD using the Euclidean algorithm.
 
static void test ()
 Self-test implementation.
 
int main ()
 Main function.
 

Detailed Description

This program aims at calculating the GCD of n numbers.

The GCD of n numbers can be calculated by repeatedly calculating the GCDs of pairs of numbers i.e. \(\gcd(a, b, c)\) = \(\gcd(\gcd(a, b), c)\) Euclidean algorithm helps calculate the GCD of each pair of numbers efficiently

See also
gcd_iterative_euclidean.cpp, gcd_recursive_euclidean.cpp

Definition in file gcd_of_n_numbers.cpp.

Function Documentation

◆ check_all_zeros()

template<std::size_t n>
bool math::gcd_of_n_numbers::check_all_zeros ( const std::array< int, n > & a)

Function to check if all elements in the array are 0.

Parameters
aArray of numbers
Returns
'True' if all elements are 0
'False' if not all elements are 0

Definition at line 53 of file gcd_of_n_numbers.cpp.

53 {
54 // Use std::all_of to simplify zero-checking
55 return std::all_of(a.begin(), a.end(), [](int x) { return x == 0; });
56}

◆ gcd()

template<std::size_t n>
int math::gcd_of_n_numbers::gcd ( const std::array< int, n > & a)

Main program to compute GCD using the Euclidean algorithm.

Parameters
aArray of integers to compute GCD for
Returns
GCD of the numbers in the array or std::nullopt if undefined

Definition at line 64 of file gcd_of_n_numbers.cpp.

64 {
65 // GCD is undefined if all elements in the array are 0
66 if (check_all_zeros(a)) {
67 return -1; // Use std::optional to represent undefined GCD
68 }
69
70 // divisors can be negative, we only want the positive value
71 int result = std::abs(a[0]);
72 for (std::size_t i = 1; i < n; ++i) {
73 result = gcd_two(result, std::abs(a[i]));
74 if (result == 1) {
75 break; // Further computations still result in gcd of 1
76 }
77 }
78 return result;
79}
uint64_t result(uint64_t n)
int gcd_two(int x, int y)
Function to compute GCD of 2 numbers x and y.
bool check_all_zeros(const std::array< int, n > &a)
Function to check if all elements in the array are 0.

◆ gcd_two()

int math::gcd_of_n_numbers::gcd_two ( int x,
int y )

Function to compute GCD of 2 numbers x and y.

Parameters
xFirst number
ySecond number
Returns
GCD of x and y via recursion

Definition at line 35 of file gcd_of_n_numbers.cpp.

35 {
36 // base cases
37 if (y == 0) {
38 return x;
39 }
40 if (x == 0) {
41 return y;
42 }
43 return gcd_two(y, x % y); // Euclidean method
44}

◆ main()

int main ( void )

Main function.

Returns
0 on exit

Definition at line 111 of file gcd_of_n_numbers.cpp.

111 {
112 test(); // run self-test implementation
113 return 0;
114}
static void test()
Self-test implementation.

◆ test()

static void test ( )
static

Self-test implementation.

Returns
void

Definition at line 87 of file gcd_of_n_numbers.cpp.

87 {
88 std::array<int, 1> array_1 = {0};
89 std::array<int, 1> array_2 = {1};
90 std::array<int, 2> array_3 = {0, 2};
91 std::array<int, 3> array_4 = {-60, 24, 18};
92 std::array<int, 4> array_5 = {100, -100, -100, 200};
93 std::array<int, 5> array_6 = {0, 0, 0, 0, 0};
94 std::array<int, 7> array_7 = {10350, -24150, 0, 17250, 37950, -127650, 51750};
95 std::array<int, 7> array_8 = {9500000, -12121200, 0, 4444, 0, 0, 123456789};
96
97 assert(math::gcd_of_n_numbers::gcd(array_1) == -1);
98 assert(math::gcd_of_n_numbers::gcd(array_2) == 1);
99 assert(math::gcd_of_n_numbers::gcd(array_3) == 2);
100 assert(math::gcd_of_n_numbers::gcd(array_4) == 6);
101 assert(math::gcd_of_n_numbers::gcd(array_5) == 100);
102 assert(math::gcd_of_n_numbers::gcd(array_6) == -1);
103 assert(math::gcd_of_n_numbers::gcd(array_7) == 3450);
104 assert(math::gcd_of_n_numbers::gcd(array_8) == 1);
105}