Sha256: 2ab29f88d65e85aaa6d8e9c7eea84776caed9587c686164f63525c23a4367792

Contents?: true

Size: 940 Bytes

Versions: 7

Compression:

Stored size: 940 Bytes

Contents

#include "roman_numerals.h"
#include <stdlib.h>
#include <string.h>

#define NUM_OF_ELEMENTS(a)    (sizeof(a) / sizeof(a[0]))
#define MAX_NUMERAL_LENGTH    (7)

typedef struct
{
    char *numeral;
    unsigned int value;
} numeral_values_t;

const numeral_values_t numeral_values[] =
{
    { "M", 1000 },
    { "CM", 900 },
    { "D",  500 },
    { "CD", 400 },
    { "C",  100 },
    { "XC",  90 },
    { "L",   50 },
    { "XL",  40 },
    { "X",   10 },
    { "IX",   9 },
    { "V",    5 },
    { "IV",   4 },
    { "I",    1 }
};

char * to_roman_numeral(unsigned int number)
{
   char *numerals = calloc(0, sizeof(char) * MAX_NUMERAL_LENGTH);

   for (size_t i = 0; i < NUM_OF_ELEMENTS(numeral_values); i++) {
      while (number >= numeral_values[i].value) {
         strncat(numerals, numeral_values[i].numeral, MAX_NUMERAL_LENGTH - strlen(numerals));
         number -= numeral_values[i].value;
      }
   }

   return numerals;
}

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
trackler-2.0.0.5 tracks/c/exercises/roman-numerals/src/example.c
trackler-2.0.0.4 tracks/c/exercises/roman-numerals/src/example.c
trackler-2.0.0.3 tracks/c/exercises/roman-numerals/src/example.c
trackler-2.0.0.2 tracks/c/exercises/roman-numerals/src/example.c
trackler-2.0.0.1 tracks/c/exercises/roman-numerals/src/example.c
trackler-2.0.0.0 tracks/c/exercises/roman-numerals/src/example.c
trackler-1.0.4.1 tracks/c/exercises/roman-numerals/src/example.c