chromium / chromium / src / 64c2848c0ca94a6f4ce822d80d2506587439eab4 / . / third_party / lcov / example / methods / gauss.c

/* | |

* methods/gauss.c | |

* | |

* Calculate the sum of a given range of integer numbers. | |

* | |

* Somewhat of a more subtle way of calculation - and it even has a story | |

* behind it: | |

* | |

* Supposedly during math classes in elementary school, the teacher of | |

* young mathematician Gauss gave the class an assignment to calculate the | |

* sum of all natural numbers between 1 and 100, hoping that this task would | |

* keep the kids occupied for some time. The story goes that Gauss had the | |

* result ready after only a few minutes. What he had written on his black | |

* board was something like this: | |

* | |

* 1 + 100 = 101 | |

* 2 + 99 = 101 | |

* 3 + 98 = 101 | |

* . | |

* . | |

* 100 + 1 = 101 | |

* | |

* s = (1/2) * 100 * 101 = 5050 | |

* | |

* A more general form of this formula would be | |

* | |

* s = (1/2) * (max + min) * (max - min + 1) | |

* | |

* which is used in the piece of code below to implement the requested | |

* function in constant time, i.e. without dependencies on the size of the | |

* input parameters. | |

* | |

*/ | |

#include "gauss.h" | |

int gauss_get_sum (int min, int max) | |

{ | |

/* This algorithm doesn't work well with invalid range specifications | |

so we're intercepting them here. */ | |

if (max < min) | |

{ | |

return 0; | |

} | |

return (int) ((max + min) * (double) (max - min + 1) / 2); | |

} |