Snippet
/*
Idea to write and post this code born after http://www.dreamincode.net/code/snippet832.htm wrong code review
*/
#include <stdio.h>
unsigned int roman_ranges[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1, 0 };
unsigned int roman_addsin[] = {-1000, +100, -500, +100, -100, +10, -50, +10, -10, +1, -5, +1, -1, 0 };
char roman_letters[] = { 'M', 'C', 'D', 'C', 'C', 'X', 'L', 'X', 'X', 'I', 'V', 'I', 'I', 0 };
size_t find_index(unsigned int li) {
unsigned int *roman_ranges_ptr = roman_ranges;
while (*roman_ranges_ptr && li < *roman_ranges_ptr) {
++roman_ranges_ptr;
}
return roman_ranges_ptr - roman_ranges;
}
char* uint2roman(unsigned int li, char* buf, size_t bufsize) {
size_t index;
if (bufsize < 1) {
return NULL; // buffer size is not enough for convertion
}
if ( (*buf = roman_letters[ (index = find_index(li)) ]) ) {
return uint2roman(li + roman_addsin[index], buf+1, bufsize-1);
}
return buf;
}
#define ROMAN_NUMBER_BUF_SIZE 64
int main() {
unsigned int nr;
char roman_str[ROMAN_NUMBER_BUF_SIZE];
printf("%s", "Enter an integer: ");
scanf("%lu", &nr);
if (uint2roman(nr, roman_str, ROMAN_NUMBER_BUF_SIZE)) {
printf("Your roman number is %s\n", roman_str );
} else {
printf("%s", "Bad roman number or buffer size too small\n");
}
}
Copy & Paste
|