
#include <cstdlib>
#include <iostream>

// some care has been taken to make this behave correctly even if base or exponent are 0 or 1

int pow_by_value( int x, int y )
{
	int result = 1;
	for ( ; y > 0; --y )
	{
		result *= x;
	}
	return result;
}

void pow_by_reference( int &x, int y )
{
	int tmp(x);
	x = 1;
	for ( ; y > 0; --y )
	{
		x *= tmp;
	}
	return;
}



int main ( int argc, char ** argv )
{
	if ( argc != 3 )
	{
		std::cerr <<
			"usage: " << argv[0] << " x y\n"
		 	"returns: x^y"	<< std::endl;
		return 1;
	}

	int x = atoi(argv[1]);
	int y = atoi(argv[2]);

	std::cout << "x=" << x << "  y=" << y << std::endl;
	std::cout << "pow_by_value: " << pow_by_value(x,y) << std::endl;
	pow_by_reference(x,y);
	std::cout << "pow_by_reference: " << x << std::endl;

	return 0;
}

