Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zadanie SPOJ JSUMRZYM - Dodawanie rzymskie

Ostatnio zmodyfikowano 2020-11-15 19:51
Autor Wiadomość
pekfos
» 2020-02-08 21:34:47
To zadanie ze SPOJa, skąd wiec te zalecenie? Jeśli ktoś Ci poradził użycie mapy, to poradził źle.
Zamień iterowanie po mapie na wyszukiwanie w mapie. Wyszukiwanie wartości liczbowej zapisu rzymskiego ma tu jeszcze jakiś sens.
P-176202
Biedrzyk
Temat założony przez niniejszego użytkownika
» 2020-02-09 12:31:57
W ramach ćwiczeń na kursie dostałęm do rozwiązania zadanie ze spoja z zaleceniem użycia mapy. Nie chodziło o to, że jest najlepsza do tego typu zadania, ale żeby przećwiczyć samo stosowanie mapy.
Jak na razie wygląda to tak(dla małych liczb działa bez problemu, schody się zaczynają jak mamy duże liczby):

C/C++
#include <iostream>
#include <map>

using namespace std;

void translateRoman( string firstRomanLetter, string secondRomanLetter, map < int, string > rome )
{
    int a = 0, b = 0;
    int dlugosc, suma = 0;
    dlugosc = firstRomanLetter.length();
   
    map < int, string >::reverse_iterator ritr;
    for( map < int, string >::iterator itr = rome.begin(); itr != rome.end(); itr++ )
    {
        if( itr->second == firstRomanLetter )
        {
            a = itr->first;
            cout << a; // na razie wstawilem, zeby sprawdzic czy dobrze liczy
        }
        if( itr->second == secondRomanLetter )
        {
            b = itr->first;
            cout << b; // na razie wstawilem, zeby sprawdzic czy dobrze liczy
        }
    }
    for( int i = 0; i < dlugosc; i++ )
    {
        cout << firstRomanLetter[ i ];
        for( map < int, string >::iterator itr = rome.begin(); itr != rome.end(); itr++ ) // tutaj w założeniu chciałem kolejno litery sprawdzać i podstawiać cyfry żeby uzyskać wynik -
        { //do tej pory dla małych liczb, porównywalnych z mapa działa bez problemu ale jak jużdamy trzeci input z treści zadania to wychodzi mi o :/
            if( itr->second == firstRomanLetter[ i ] )
            {
                a += itr->first;
            }
        }
    }
    int arabic = a + b;
    cout << arabic << endl; // na razie wstawilem, zeby sprawdzic czy dobrze liczy
   
    for( map < int, string >::iterator itr = rome.begin(); itr != rome.end(); itr++ )
    {
        if( arabic == itr->first )
        {
            cout << itr->second << endl;
        }
        if( arabic != itr->first )
        {
            string newRomanLetter = "";
            for( ritr = rome.rbegin(); ritr != rome.rend(); ++ritr )
            {
                while( ritr->first <= arabic )
                {
                    newRomanLetter += ritr->second;
                    arabic -= ritr->first;
                }
            }
            cout << newRomanLetter;
        }
    }
}

int main()
{
    string firstRomanLetter = "", secondRomanLetter = "";
    map < int, string > rome;
    map < int, string >::iterator itr;
    map < int, string >::reverse_iterator ritr;
   
    rome[ 1000 ] = "M";
    rome[ 900 ] = "CM";
    rome[ 500 ] = "D";
    rome[ 400 ] = "CD";
    rome[ 100 ] = "C";
    rome[ 90 ] = "XC";
    rome[ 50 ] = "L";
    rome[ 40 ] = "XL";
    rome[ 10 ] = "X";
    rome[ 9 ] = "IX";
    rome[ 8 ] = "VIII";
    rome[ 7 ] = "VII";
    rome[ 6 ] = "VI";
    rome[ 5 ] = "V";
    rome[ 4 ] = "IV";
    rome[ 3 ] = "III";
    rome[ 2 ] = "II";
    rome[ 1 ] = "I";
   
    while(( getline( cin, firstRomanLetter ) ) &&( getline( cin, secondRomanLetter ) ) )
    {
        translateRoman( firstRomanLetter, secondRomanLetter, rome );
    }
    return 0;
}
P-176204
pekfos
» 2020-02-09 13:42:43
Są ważniejsze rzeczy do przećwiczenia, niż wtykanie kontenerów na siłę. Na przykład poprawne używanie funkcji. Twoje translateRoman() jest przykładem, jak tego nie robić. Ta funkcja robi zbyt wiele. Problem powinien być dalej zdekomponowany do konwersji zapisu rzymskiego w obie strony. Przykład masz w kodzie mizie.
Każdy kontener ma swoje zalety i wady, więc jak chcesz któregoś użyć, to dla jego zalet, a nie wad. Zaletą mapy jest szybkie wyszukiwanie, a wadą wolne iterowanie. Jeśli nie używasz wyszukiwania, to używasz kontenera źle, a ćwiczenie robienia czegoś źle nie ma żadnych pozytywnych efektów.
Zrób tak:
  • Zapomnij o mapie
  • Sprowadź problem do dwóch konwersji
  • Zaimplementuj konwersje, używając mapy jeśli służy konkretnemu algorytmowi, a więc nie zaczynaj od mapy i nie pisz algorytmu dookoła niej. Nie zakładaj że będzie jedna mapa do obu algorytmów i nie próbuj tego na siłę osiągać.
i będzie dobrze.
P-176205
Biedrzyk
Temat założony przez niniejszego użytkownika
» 2020-02-09 19:52:33
Dzięki za podrzucenie pomysłu i rozwianie kilku wątpliwości. Walczę dalej.
P-176217
kucikprogramista
Dodawanie rzymskie
» 2020-11-15 19:51:22
Udało Ci się rozwiązać to zadanie?
Mógłbyś podzielić się rozwiązaniem?
Pozdrawiam
P-177715
1 « 2 »
Poprzednia strona Strona 2 z 2