In each of the conversion functions, you did the same thing. You just did it with different bases. So, instead of having binary(int), hex(int) and octal(int), you could have a function called convert that takes a starting base, an end base and a number and converts accordingly.
int convert(int baseStart, int baseEnd, int number)
Of course, if you want to make this possible with return base greater than 10, you would need a return type that includes characters. A character string or an array, for instance.
Also, you could definitely use the stack for each of the functions in your original code or in the 'new' code.
This makes your code reusable because it can convert from any base to any other. It also makes it easier to read, easier to maintain and it looks nicer. It is not necessarily more efficient, though. I won't get into efficiency here, but I will point out that efficiency has nothing to do with the number of lines of code you have in your source .. a common misconception among programmers until they get bitchslapped by the higher maths and learn algorithmic proofs of efficiency and correctness. That is for another day.
Damn it, I should be working here.
Hope we've helped. Feel free to post your next assignment so we can help you think it through. I think we did a good job of leading you without handing you the answers or losing you along the way. Yes?