[C++] Zadanie SPOJ JSUMRZYM - Dodawanie rzymskie
Ostatnio zmodyfikowano 2020-11-15 19:51
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.
|
|
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): #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; } if( itr->second == secondRomanLetter ) { b = itr->first; cout << b; } } for( int i = 0; i < dlugosc; i++ ) { cout << firstRomanLetter[ i ]; for( map < int, string >::iterator itr = rome.begin(); itr != rome.end(); itr++ ) { if( itr->second == firstRomanLetter[ i ] ) { a += itr->first; } } } int arabic = a + b; cout << arabic << endl; 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; }
|
|
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: i będzie dobrze. |
|
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. |
|
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 |
|
1 « 2 » |