You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

115 lines
3.2 KiB
C++

#include <iostream>
#include <stdlib.h>
#include <limits.h>
// disclaimer, the following function is partially copy pasted from
// stackoverflow as this functionality is not a core part of the
// homework. of course I understand what it does, I read it!
int check_number(int *num, char* arg) {
char *p;
long conv = strtol(arg, &p, 10);
// Check for problems: e.g., the string does not represent an integer
// or the integer is larger than int
if ( *p != '\0' || conv > INT_MAX || conv < INT_MIN) {
return 0;
}
*num = conv;
return 1;
}
// Aufgabe 1.1
int truncate_fraction(int zaehler, int nenner) {
// moving the minus
if (nenner < 0) {
zaehler = zaehler * (-1);
nenner = nenner * (-1);
}
// the actual algorithm
int teiler = 1;
if (abs(nenner) < abs(zaehler)) {
if (nenner % zaehler == 0) {
zaehler = zaehler / nenner;
nenner = 1;
} else {
teiler = abs(nenner) - 1;
}
} else {
teiler = abs(zaehler) - 1;
}
for (;teiler > 1; teiler--) {
if ((nenner % teiler == 0) && (zaehler % teiler == 0)) {
nenner /= teiler;
zaehler /= teiler;
}
}
if (nenner > 1)
std::cout << "Zähler: " << zaehler << "; Nenner: " << nenner << std::endl;
else
std::cout << "Kein Bruch. Zahl: " << zaehler << std::endl;
return 0;
}
// Aufgabe 1.2
int do_this_recursive(int groesser, int kleiner) {
if (groesser % kleiner == 0)
return kleiner;
return do_this_recursive(groesser, kleiner-1);
}
int find_greatest_common_divisor(int zaehler, int nenner) {
if (nenner % zaehler == 0)
return zaehler;
if (zaehler % nenner == 0)
return nenner;
int ggt = 1;
if (abs(nenner) > abs(zaehler))
ggt = do_this_recursive(abs(nenner), abs(zaehler));
else
ggt = do_this_recursive(abs(zaehler), abs(nenner));
return ggt;
}
// Aufgabe 1.3
int main(int argc, char *argv[]) {
// you know, I could also do this repeatedly like 1.3 wants, but...
// I think technically you can also just call the binary with arguments repeatedly as well
// to prevent loosing points, you can have this:
/*
* int main() {
* int zaehler, nenner;
* std::cout << "Input Zähler: " << std::endl;
* std::cin >> zaehler;
* std::cout << "Input Nenner: " << std::endl;
* std::cin >> nenner;
* truncate_fraction(zaehler, nenner);
* int ggt = find_greatest_common_divisor(zaehler, nenner);
* std::cout << "Größter gemeinsamer Teiler: " << ggt << std::endl;
* return 0;
* }
*
* Please don't make me do it like this, it scares me
*/
if (argc < 3) {
std::cout << "No/Not enough parameters given." << std::endl;
return -1;
}
int zaehler, nenner;
if (!(check_number(&zaehler, argv[1]) && check_number(&nenner, argv[2]))) {
std::cout << "Your input is not valid." << std::endl;
return -1;
}
truncate_fraction(zaehler, nenner);
int ggt = find_greatest_common_divisor(zaehler, nenner);
std::cout << "Größter gemeinsamer Teiler: " << ggt << std::endl;
return 0;
}