/* Euklidov algoritam za odredjivanje NZD - preko oduzimanja - uklonjena rekurzija */
#include <stdio.h>

unsigned nzd__(unsigned a, unsigned b) {
  /* Beskonacna petlja - oslanjamo se na cinjenicu da return naredba
	 prekida petlju */
  while (true) {
	/* printf("%u, %u\n", a, b); */
    if (a == 0)
      return b;
    if (b == 0)
      return a;
    if (a > b)
      a -= b;
    else
      b -= a;
  }
}

unsigned nzd_(unsigned a, unsigned b) {
  /* Uklonjena beskonacna petlja */
  while (a != 0 && b != 0) {
	/* printf("%u, %u\n", a, b); */
    if (a > b)
       a -= b;
    else
      b -= a;
  }
  if (a == 0)
	return b;
  if (b == 0)
	return a;
}


/* Uslov a == 0 u prethodnoj funkciji je moguc samo na pocetku, posto
   se u slucaju da je a == b umanjuje b. Ovim se implementacija moze
   ubrzati. */
unsigned nzd(unsigned a, unsigned b) {
  if (a == 0)
	return b;

  while (b != 0) {
	/* printf("%u, %u\n", a, b); */
	if (a > b)
	  a -= b;
	else
	  b -= a;
  }

  return a;
}


int main() {
  unsigned a = 105, b = 252;
  printf("NZD(%u, %u) = %u\n", a, b, nzd(a, b));
  return 0;
}