The challenge
Given a number return the closest number to it that is divisible by 10.
Example input:
22
25
37
Expected output:
20
30
40
The solution in C
Option 1:
#include <math.h>
int round_to_10 (int n) {
return round(n / 10.0) * 10;
}
Option 2:
int round_to_10(int n) {
return (n + 5) / 10 * 10;
}
Option 3:
int round_to_10 (int n) {
int r = n % 10;
if (r > 0)
return r < 5 ? n - r : n - r + 10;
else if (r < 0)
return r > -5 ? n - r : n - r - 10;
return n;
}
Test cases to validate our solution
#include <criterion/criterion.h>
extern int round_to_10 (int n);
static void do_test (int n, int expected);
Test(tests_suite, sample_tests)
{
do_test(0, 0);
do_test(10, 10);
do_test(22, 20);
do_test(25, 30);
do_test(37, 40);
}
static void do_test (int n, int expected)
{
int actual = round_to_10(n);
cr_assert_eq(actual, expected,
"for n = %d, expected %d, but got %d",
n, expected, actual
);
}