algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Zamiana z i na system rzymski - Implementacja w C/C++
Ocena użytkownikóww: *****  / 10
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 09 lutego 2007 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

rzymskie.c:
//Konwersja liczby arabskie <-> rzymskie
//www.algorytm.org
//(c)2006 Tomasz Lubinski

#include "stdio.h"

#define ROMAN_N 7
unsigned int arabic[ROMAN_N] = {1000, 500, 100, 50, 10, 5, 1};
char roman[ROMAN_N] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};


// Converts arabic <number> to roman <result>
// Returns <result> or NULL, if an ERROR occurs.
char *arabic2roman(char *result, int number)
{
    int i = 0, //position in arabic and roman arrays
        j = 0; //position in result

    if ((number > 3999) || (number <= 0))
    {
        return NULL;
    }

    while ((number) && (i < ROMAN_N))
    {
        if(number >= arabic[i])
        {
            number -= arabic[i];
            result[j++] = roman[i];
        }
        else if ((i%2 == 0) &&
                 (i<ROMAN_N-2) && // 9xx condition
                 (number >= arabic[i] - arabic[i+2]) &&
                 (arabic[i+2] != arabic[i] - arabic[i+2]))
        {
            number -= arabic[i] - arabic[i+2];
            result[j++] = roman[i+2];
            result[j++] = roman[i];
            i++;
        }
        else if ((i%2 == 1) &&
                 (i<ROMAN_N-1) && //4xx condition
                 (number >= arabic[i] - arabic[i+1]) &&
                 (arabic[i+1] != arabic[i] - arabic[i+1]))
        {
            number -= arabic[i] - arabic[i+1];
            result[j++] = roman[i+1];
            result[j++] = roman[i];
            i++;
        }
        else
        {
            i++;
        }
    }
    result[j++] = 0;

    return result;
}

// Converts roman <number> to arabic
// Returns <result> or -1, if an ERROR occurs.
int roman2arabic(char *number)
{
    int i = 0, //position in arabic and roman arrays
        j = 0, //position in number
        result = 0,
        length = 0;

    length = strlen(number);

    while ((j<length) && (i<ROMAN_N))
    {
        if(number[j] == roman[i])
        {
            result += arabic[i];
            j++;
        }
        else if ((i%2 == 0) &&
                 (i<ROMAN_N-2) && // 9xx condition
                 (j<length-1) &&
                 (number[j] == roman[i+2]) &&
                 (number[j+1] == roman[i]))
        {
            result += arabic[i] - arabic[i+2];
            j += 2;
            i++;
        }
        else if ((i%2 == 1) &&
                 (i<ROMAN_N-1) && //4xx condition
                 (j<length-1) &&
                 (number[j] == roman[i+1]) &&
                 (number[j+1] == roman[i]))
        {
            result += arabic[i] - arabic[i+1];
            j += 2;
            i++;
        }
        else
        {
            i++;
        }
    }

    //there was an error during conversion
    if (i == ROMAN_N)
    {
       result = -1;
    }

    return result;
}

int main(void)
{
   char roman[50];

   arabic2roman(roman, 1981);
   printf("%d = %s\n", roman2arabic(roman), roman);
   arabic2roman(roman, 1);
   printf("%d = %s\n", roman2arabic(roman), roman);
   arabic2roman(roman, 3);
   printf("%d = %s\n", roman2arabic(roman), roman);
   arabic2roman(roman, 4);
   printf("%d = %s\n", roman2arabic(roman), roman);
   arabic2roman(roman, 5);
   printf("%d = %s\n", roman2arabic(roman), roman);
   arabic2roman(roman, 6);
   printf("%d = %s\n", roman2arabic(roman), roman);
   arabic2roman(roman, 45);
   printf("%d = %s\n", roman2arabic(roman), roman);
   arabic2roman(roman, 68);
   printf("%d = %s\n", roman2arabic(roman), roman);

   return 0;
}
Komentarze
photo
+1 # Kemot 2012-11-05 09:44
Jakieś warunki typu
arabic[i+2] != arabic - arabic[i+2]
co to ma niby sprawdzać?
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz