Middle three digits: Difference between revisions
Content added Content deleted
(Initial Haskell version.) |
(Add C implementation) |
||
Line 72: | Line 72: | ||
-2002: ****number of digits must be >= 3 and odd**** |
-2002: ****number of digits must be >= 3 and odd**** |
||
0: ****number of digits must be >= 3 and odd****</pre> |
0: ****number of digits must be >= 3 and odd****</pre> |
||
=={{header|C}}== |
|||
<lang C>#include <stdio.h> |
|||
#define E_SMALL 1 |
|||
#define E_EVEN 2 |
|||
static const char *errors[] = {"too small", "even length"}; |
|||
int mid3(int num, char *buf) |
|||
{ |
|||
int i = 2, mag = 1; |
|||
int tmp = num = num < 0 ? -num : num; /* Discard sign. */ |
|||
/* A number's magnitude can be used to determine both |
|||
* its length and, in this case, the oddness thereof. */ |
|||
while (tmp /= 10) mag *= 10; |
|||
if (mag < 100) return E_SMALL; |
|||
if (mag & 128) return E_EVEN; |
|||
while (num > 1000) { |
|||
num -= num / mag * mag; /* Chop left digit. */ |
|||
num /= 10; /* Now the right. */ |
|||
mag /= 100; |
|||
} |
|||
/* Populate a character buffer to handle zeroes. */ |
|||
for (i = 2; i >= 0; num /= 10, --i) |
|||
buf[i] = num % 10 + '0'; |
|||
return 0; |
|||
} |
|||
int main(void) |
|||
{ |
|||
int num; |
|||
char buf[4] = ""; |
|||
while (scanf("%d", &num) != EOF) { |
|||
printf("%d: ", num); |
|||
if ((num = mid3(num, buf)) == 0) |
|||
printf("%s\n", buf); |
|||
else |
|||
puts(errors[--num]); |
|||
} |
|||
return 0; |
|||
}</lang> |
|||
=={{header|C++}}== |
=={{header|C++}}== |