## The challenge

A number m of the form 10x + y is divisible by 7 if and only if x − 2y is divisible by 7. In other words, subtract twice the last digit from the number formed by the remaining digits. Continue to do this until a number known to be divisible by 7 is obtained; you can stop when this number has at most 2 digits because you are supposed to know if a number of at most 2 digits is divisible by 7 or not.

The original number is divisible by 7 if and only if the last number obtained using this procedure is divisible by 7.

Examples:

1 – `m = 371 -> 37 − (2×1) -> 37 − 2 = 35` ; thus, since 35 is divisible by 7, 371 is divisible by 7.

The number of steps to get the result is `1`.

2 – `m = 1603 -> 160 - (2 x 3) -> 154 -> 15 - 8 = 7` and 7 is divisible by 7.

3 – `m = 372 -> 37 − (2×2) -> 37 − 4 = 33` ; thus, since 33 is not divisible by 7, 372 is not divisible by 7.

4 – `m = 477557101->47755708->4775554->477547->47740->4774->469->28` and 28 is divisible by 7, so is 477557101. The number of steps is 7.

Your task is to return to the function `seven(m)` (m integer >= 0) an array (or a pair, depending on the language) of numbers, the first being the last number `m` with at most 2 digits obtained by your function (this last `m` will be divisible or not by 7), the second one being the number of steps to get the result.

Forth Note:

Return on the stack `number-of-steps, last-number-m-with-at-most-2-digits`

Examples:

 ``````1 2 3 `````` ``````seven(371) should return [35, 1] seven(1603) should return [7, 2] seven(477557101) should return [28, 7] ``````

## The solution in C

Option 1:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 `````` ``````#include int* seven (long long m) { int* res = (int*)malloc (2 * sizeof (int)); int step = 0; while (m > 99) { m = m / 10 - 2 * (m % 10); ++step; } res = m; res = step; return res; } ``````

Option 2:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 `````` ``````int* seven(long long m) { static int res = {}; int cnt = 0; while (m > 99) { long long a0 = m % 10; m = (m - a0) / 10 - 2 * a0; cnt++; } res = (int) m; res = cnt; return res; } ``````

Option 3:

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 `````` ``````#include #include int* seven(long long n) { assert(n >= 0); int *result = (int *) malloc(2 * sizeof(int)); if (! result) return NULL; int steps = 0; for (; n > 99; ++steps) n = n / 10 - n % 10 * 2; result = n; result = steps; return result; } ``````

## Test cases to validate our solution

 `````` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 `````` ``````#include extern int *seven (long long m); static void do_test (long long m, const int expected) { int *actual = seven(m); cr_assert_arr_eq(actual, expected, 2 * sizeof *expected, "for m = %lld, expected {%d, %d} but got {%d, %d}", m, expected, expected, actual, actual ); } #define ARRAY (const int) Test(tests_suite, fixed_tests) { do_test(1021, ARRAY{10, 2}); do_test(477557101, ARRAY{28, 7}); do_test(477557102, ARRAY{47, 7}); do_test(1603, ARRAY{7, 2}); do_test(371, ARRAY{35, 1}); do_test(1369851, ARRAY{0, 5}); do_test(483, ARRAY{42, 1}); do_test(483595, ARRAY{28, 4}); do_test(0, ARRAY{0, 0}); do_test(170232833617690725ll, ARRAY {0, 16}); } ``````