Source: https://mitocw.ups.edu.ec/courses/electrical-engineering-and-computer-science/6-087-practical-programming-in-c-january-iap-2010/assignments/MIT6_087IAP10_assn03_sol.pdf