Write a function that calculates the greatest common divisor, as described in the course notes, and the least common multiple. When calculating the least-common multiple, the easiest is to use the formula ${\rm lcm}(m, n) = \frac{mn}{\gcd(m,n)}$. The function declarations are:
unsigned long gcd( unsigned long m, unsigned long n ); unsigned long lcm( unsigned long m, unsigned long n );
There is a problem here, however, as the calculation $mn$ may overflow, while the result is never-the-less storable as an unsigned long.
For example, your code should work with:
#include <iostream>
unsigned long gcd( unsigned long m, unsigned long n );
unsigned long lcm( unsigned long m, unsigned long n );
int main();
int main() {
unsigned long m{17217616477};
unsigned long n{31097282059};
std::cout << gcd( m, n ) << std::endl;
// Should output 15525353
std::cout << lcm( m, n ) << std::endl;
// Should output 34486885803431
return 0;
}
Your program should throw a std::range_error if the least common multiple cannot be stored as an unsigned long; for example, the following code should generate an exception:
#include <iostream>
#include <stdexcept>
unsigned long gcd( unsigned long m, unsigned long n );
unsigned long lcm( unsigned long m, unsigned long n );
int main();
int main() {
unsigned long m{4294967311}; // 203280222nd prime number
unsigned long n{4294967357}; // 203280223rd prime number
std::cout << gcd( m, n ) << std::endl;
// Should output 1
try {
std::cout << lcm( m, n ) << std::endl;
// This should generate an exception
} catch ( std::range_error &e ) {
std::cout << e.what() << std::endl;
}
return 0;
}