• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie SPOJ - Liczba na słowo z mapą

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 1 września 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

Witam, 

Piszę program, który ma zamienić liczbę na słowo: https://pl.spoj.com/problems/JLITOSL/ Nie wiem co mam dalej robić, czy sposób aby stworzyć jedną mapę prezentującą jedności, dziesiątki, itd. jest poprawny? Może lepiej stworzyć kilka map?

Muszę użyć mapę. Oto, co na razie mam:

#include <iostream>
#include <map>
#include <string>

using namespace std;

int main()
{
    map < int, string > liczbyDoZamiany;
    int liczba, liczbaTestow, pomocnicza1, pomocnicza2, pomocnicza3;

    string koncowki [9] = {"jeden", "dwa", "trzy", "cztery", "piec", "szesc", "siedem", "osiem", "dziewiec"};
    string skrotyLiczb [6] = {"","tys.","mln.","mld.","bln."};

    liczbyDoZamiany[1] = "jeden";
    liczbyDoZamiany[2] = "dwa";
    liczbyDoZamiany[3] = "trzy";
    liczbyDoZamiany[4] = "cztery";
    liczbyDoZamiany[5] = "piec";
    liczbyDoZamiany[6] = "szesc";
    liczbyDoZamiany[7] = "siedem";
    liczbyDoZamiany[8] = "osiem";
    liczbyDoZamiany[9] = "dziwiec";

    liczbyDoZamiany[10] = "dziesiec";
    liczbyDoZamiany[20] = "dwadziescia";
    liczbyDoZamiany[30] = "trzydziesci";
    liczbyDoZamiany[40] = "czterdziesci";
    liczbyDoZamiany[50] = "piecdziesiat";
    liczbyDoZamiany[60] = "szczescdziesiat";
    liczbyDoZamiany[70] = "siedemdziesiat";
    liczbyDoZamiany[80] = "osiemdziesiat";
    liczbyDoZamiany[90] = "dziewiecdziesiat";

    liczbyDoZamiany[100] = "sto";
    liczbyDoZamiany[200] = "dwiescie";
    liczbyDoZamiany[300] = "trzysta";
    liczbyDoZamiany[400] = "czterysta";
    liczbyDoZamiany[500] = "piecet";
    liczbyDoZamiany[600] = "szescset";
    liczbyDoZamiany[700] = "siedemset";
    liczbyDoZamiany[800] = "osiemset";
    liczbyDoZamiany[900] = "dziewiecset";

    liczbyDoZamiany[11] = "jedenascie";
    liczbyDoZamiany[12] = "dwanascie";
    liczbyDoZamiany[13] = "trzynascie";
    liczbyDoZamiany[14] = "czternascie";
    liczbyDoZamiany[15] = "pietnascie";
    liczbyDoZamiany[16] = "szesnascie";
    liczbyDoZamiany[17] = "siedemnascie";
    liczbyDoZamiany[18] = "osiemnascie";
    liczbyDoZamiany[19] = "dziewietnascie";



    cin >> liczbaTestow;

    while (liczbaTestow--) {
        cin >> liczba;

        map <int, string >::iterator itr = liczbyDoZamiany.find(liczba);

        if (itr != liczbyDoZamiany.end()) {
            cout << itr -> second;
            cout << endl;
        }
        if ((liczba < 10)) {
            pomocnicza3 = ((liczba % 10));
            
        }
        
        if ((liczba > 20) && (liczba < 100)) {         //dziesiatki
            pomocnicza1 = (liczba % 100) / 10;
            cout << pomocnicza1;
            cout << endl;
        }
        if ((liczba > 100) && (liczba < 1000)) {      //setki
            pomocnicza2 = (liczba % 1000) / 100;
        }

    }


    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 1 września 2020 przez TOM_CPP Pasjonat (22,640 p.)
edycja 2 września 2020 przez TOM_CPP

Użyj rekurencji i jednej mapy, tak jak w poniższym przypadku:

#include <iostream>
#include <map>

using namespace std;

const map<long long int,string> names
{
  {0,""},{1,"jeden"},{2,"dwa"},{3,"trzy"},{4,"cztery"},
  {5,"piec"},{6,"szesc"},{7,"siedem"},{8,"osiem"},{9,"dziewiec"},
  {10,"dziesiec"},{11,"jedenascie"},{12,"dwanascie"},{13,"trzynascie"},{14,"czternascie"},
  {15,"pietnascie"},{16,"szesnascie"},{17,"siedemnascie"},{18,"osiemnasie"},{19,"dziewietnasie"},
  {20,"dwadziescia"},{30,"trzydziesci"},{40,"czterdziesci"},{50,"piedziesiat"},{60,"szescdziesiat"},
  {70,"siedemdziesiat"},{80,"osiemdziesiat"},{90,"dziewiecdziesiat"},{100,"sto"},{200,"dwiescie"},
  {300,"trzysta"},{400,"czterysta"},{500,"piecset"},{600,"szescset"},{700,"siedemset"},{800,"osiemset"},
  {900,"dziewieset"},{1000,"tys."},{1000000,"mln."},{1000000000,"mld."},{1000000000000,"bln."}
};


string translate( long long int number )
{
    switch( to_string(abs(number)).size() )
    {
        case 1:
        case 2: return number<=20?names.at(number):names.at((number/10)*10)+" "+translate(number-(number/10)*10);
        case 3: return names.at((number/100)*100)+" "+translate(number-(number/100)*100);
        case 4:
        case 5:
        case 6: return translate(number/1000)+" "+names.at(1000)+" "+translate(number-(number/1000)*1000);
        case 7:
        case 8:
        case 9: return translate(number/1000000)+" "+names.at(1000000)+" "+translate(number-(number/1000000)*1000000);
        default: break;
    }

    return "";
}

int main()
{
    cout << translate(628165298) << endl;
    return 0;
}

Jak zrozumiesz algorytm, to będziesz mogła sobie go rozszerzyć, w taki sposób aby obsługiwał liczby z zakresu 1 biliona.

komentarz 1 września 2020 przez tkz Nałogowiec (42,000 p.)
Dlaczego zwracasz pusty string? Albo inaczej. Dlaczego w ogóle go zwracasz? Nie lepszym pomysłem byłoby rzucenie czegoś, albo chociażby użycie std::optional?
komentarz 1 września 2020 przez magda_19 Gaduła (3,080 p.)

@TOM_CPP,

Dlaczego obsługujesz tylko case 2, 3, 6, 10. Co z pozostałymi?

komentarz 2 września 2020 przez TOM_CPP Pasjonat (22,640 p.)
edycja 2 września 2020 przez TOM_CPP

@magda_19,

Pozostałe przypadki są obsługiwane przez już istniejące. Jeżeli liczba będzie zawierała np. 7 cyfr, to trafi do do przypadku case 10, gdyż w taki sposób działa tutaj instrukcja switch , gdzie kilka etykiet (case) zostało podpiętych pod jeden ciąg instrukcji.

komentarz 2 września 2020 przez TOM_CPP Pasjonat (22,640 p.)

@tkz,

Teraz pusty string jest zwracany dla liczb mających więcej niż 9 cyfr. Docelowo należy to poprawić, tak aby dla każdej wartości zmiennej zwracana była jej nazwa tekstowa, ale IMHO to już zadanie dla osoby, która zadała to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 149 wizyt
pytanie zadane 22 lutego 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)
0 głosów
0 odpowiedzi 287 wizyt
0 głosów
2 odpowiedzi 579 wizyt
pytanie zadane 17 lutego 2020 w C i C++ przez Biedrzyk Nowicjusz (180 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...