int
main() {
	printInt(fac(10));
	printInt(rfac(10));
	printInt(mfac(10));
        printInt(ifac(10));
        double r ; // just to test blocks 
	{
	  int n = 10;
	  int r = 1;
	  while (n>0) {
	    r = r * n;
	    n = n - 1;
	  }
	  printInt(r);
	}
	printDouble(dfac(10.0));
	printString ("hello */");
        printString ("/* world") ;
        return 0 ;
}

int 
fac(int a) {
	int r;
	int n;

	r = 1;
	n = a;
	while (n > 0) {
		r = r * n;
		n = n - 1;
	}
	return r;
}

int
rfac(int n)
{
	if (n == 0)
		return 1;
	else
		return n * rfac(n-1);
}

int
mfac(int n)
{
	if (n == 0)
		return 1;
	else
		return n * nfac(n-1);
}

int
nfac(int n)
{
	if (n != 0)
		return mfac(n-1) * n;
	else
		return 1;
}

double
dfac(double n)
{
	if (n == 0.0)
		return 1.0;
	else
		return n * dfac(n-1.0);
}

int ifac(int n) { return ifac2f(1,n); }

int ifac2f(int l, int h) {
        if (l == h)
                return l;
        if (l > h)
                return 1;
        int m;
        m = (l+h) / 2;
        return ifac2f(l,m) * ifac2f(m+1,h);
}
