Sha256: d3c01b61aa1f5098ed17e81afcaaf146f296b6bb4f50a2c8f6f61115548f0f1f

Contents?: true

Size: 1.78 KB

Versions: 396

Compression:

Stored size: 1.78 KB

Contents

#include "roman_numerals.h"

namespace
{

struct digit_values
{
    char numeral;
    int value;
};

const digit_values roman_numerals[] =
{
    { 'M', 1000 },
    { 'D', 500 },
    { 'C', 100 },
    { 'L', 50 },
    { 'X', 10 },
    { 'V', 5 },
    { 'I', 1 }
};

class converter
{
public:
    converter(int n)
        : n_(n)
    {}

    std::string convert();

private:
    void thousands();
    void hundreds();
    void tens();
    void ones();
    void place(int place);
    void place_numeral(int place);
    void place_numeral_penultimate(int place, int penultimate_place);

    int n_;
    std::string result_;
};

std::string converter::convert()
{
    thousands();
    hundreds();
    tens();
    ones();
    return result_;
}

void converter::thousands()
{
    place(0);
}

void converter::hundreds()
{
    place(2);
}

void converter::tens()
{
    place(4);
}

void converter::ones()
{
    result_ += std::string(n_, 'I');
}

void converter::place(int place)
{
    const int tenth_place = place + 2;
    place_numeral(place);
    place_numeral_penultimate(place, tenth_place);
    const int half_place = place + 1;
    place_numeral(half_place);
    place_numeral_penultimate(half_place, tenth_place);
}

void converter::place_numeral(int place)
{
    while (n_ >= roman_numerals[place].value) {
        result_ += roman_numerals[place].numeral;
        n_ -= roman_numerals[place].value;
    }
}

void converter::place_numeral_penultimate(int place, int penultimate_place)
{
    const int amount = roman_numerals[place].value - roman_numerals[penultimate_place].value;
    if (n_ >= amount) {
        result_ += roman_numerals[penultimate_place].numeral;
        result_ += roman_numerals[place].numeral;
        n_ -= amount;
    }
}

}

std::string roman::convert(int n)
{
    return converter(n).convert();
}

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.179 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.178 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.177 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.176 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.175 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.174 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.173 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.172 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.171 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.170 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.169 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.167 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.166 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.165 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.164 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.163 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.162 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.161 tracks/cpp/exercises/roman-numerals/example.cpp
trackler-2.2.1.160 tracks/cpp/exercises/roman-numerals/example.cpp