15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  methods/gauss.c
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Calculate the sum of a given range of integer numbers.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Somewhat of a more subtle way of calculation - and it even has a story
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  behind it:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Supposedly during math classes in elementary school, the teacher of
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  young mathematician Gauss gave the class an assignment to calculate the
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  sum of all natural numbers between 1 and 100, hoping that this task would
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  keep the kids occupied for some time. The story goes that Gauss had the
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  result ready after only a few minutes. What he had written on his black
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  board was something like this:
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    1 + 100 = 101
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    2 + 99  = 101
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    3 + 98  = 101
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    .
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    .
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    100 + 1 = 101
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    s = (1/2) * 100 * 101 = 5050
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  A more general form of this formula would be
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *    s = (1/2) * (max + min) * (max - min + 1)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  which is used in the piece of code below to implement the requested
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  function in constant time, i.e. without dependencies on the size of the
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  input parameters.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gauss.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int gauss_get_sum (int min, int max)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* This algorithm doesn't work well with invalid range specifications
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   so we're intercepting them here. */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	if (max < min)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		return 0;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return (int) ((max + min) * (double) (max - min + 1) / 2);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
49