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

JLITOSL - Liczba na słowo mapa

Object Storage Arubacloud
0 głosów
579 wizyt
pytanie zadane 17 lutego 2020 w C i C++ przez Biedrzyk Nowicjusz (180 p.)

Jak w temacie mam problem z zadaniem ze SPOJ-a : https://pl.spoj.com/problems/JLITOSL/.
Dzięki podpowiedzi mokrowski z  https://forum.pasja-informatyki.pl/383437/jlitosl-liczba-na-slowo-spoj-c udało mi się zlepić coś takiego:


for (map<int,string>:: reverse_iterator ritr = inWords.rbegin() ; ritr != inWords.rend() ; ritr++)
    {
        if(liczba == ritr->first)
        {
            cout << ritr -> second;
        }
        if ((liczba > 20) && (liczba < 100) && (liczba != ritr -> first))
        {
            mniejsza = dziesiatki(liczba);
            nowa = liczba % 10;

            if(nowa == ritr -> first)
            {
                cout << ritr -> second << " ";
            }
            if (mniejsza == ritr -> first)
            {
                cout << ritr -> second << " ";
            }
        }
        if ((liczba > 100) && (liczba < 1000) && (liczba != ritr -> first))
        {
            mniejsza2 = setki(liczba);
            nowa3 = liczba - mniejsza2;
            nowa2 = dziesiatki(nowa3);
            mniejsza3 = nowa3 - nowa2;

            if(nowa2 == ritr -> first)
            {
                cout << ritr -> second << " ";
            }
            if (mniejsza2 == ritr -> first)
            {
                cout << ritr -> second << " ";
            }
            if (nowa3 == ritr -> first)
            {
                cout << ritr -> second << " ";
            }
            if (mniejsza3 == ritr -> first)
            {
                cout << ritr -> second << " ";
            }
        }
        if ((liczba >= 1000) && (liczba <= 1000000) && (liczba != ritr -> first))
        {
            mniejsza = (liczba / 1000);
            nowa = liczba - mniejsza;

            /*if(nowa == ritr -> first)
            {
                cout << ritr -> second << " ";
            }*/
            if (mniejsza == ritr -> first)
            {
                cout << ritr -> second << " " << "tys.";
            }
        }
    }
    return 0;
}

tylko boję się, że wpadam w pułapkę if'ów - a do biliona jeszcze daleko ;)nie jest to gotowy program - ale już jest bliżej niż dalej - pytanie tylko czy to jest dobry kierunek ;)

2 odpowiedzi

+1 głos
odpowiedź 17 lutego 2020 przez tangarr Mędrzec (154,860 p.)
Obawiam się, że błądzisz. Dodanie każdej kolejnej jednostki coraz bardziej komplikuje i zaciemnia kod.

Zastanów się jak obsłużyć poniższe liczby:
123
123'000
123'123
123'123'123
123'123'123'123
123'123'123'123'123

Podpowiedź: W funkcji konwertującej liczby na napis użyj zmiennych o nazwach: biliony, miliardy, miliony i tysiące.
komentarz 17 lutego 2020 przez Biedrzyk Nowicjusz (180 p.)
Pierwsze co mi się nasuwa na myśl to dzielenie przez 3, rozdział na kolejne trójki - w końcu co trzy liczby mamy przeskok jednostki.

 

Czyli po konwersji int-a na stringa, obliczamy długość ciągu i dzielimy przez 3?

Dobrze kombinuję?
komentarz 18 lutego 2020 przez tangarr Mędrzec (154,860 p.)
Kolejna podpowiedź:
1000
1000*1000
1000*1000*1000
1000*1000*1000*1000
komentarz 18 lutego 2020 przez Biedrzyk Nowicjusz (180 p.)
Konwersja inta na stringa zostaje i rozbijamy liczbę na trzycyfrowe grupy?
1
komentarz 18 lutego 2020 przez tangarr Mędrzec (154,860 p.)
Raczej nie bawiłbym się w konwersję na napis. Raczej użyłbym operacji dzielenia i modulo aby policzyć te zmienne.
komentarz 18 lutego 2020 przez Biedrzyk Nowicjusz (180 p.)
Dzięki za naprowadzenie! biorę się za to ;)
pytanie zadane 8 marca 2020 w C i C++ przez Biedrzyk Nowicjusz (180 p.) Rozwiązanie do zakresu 0 - 20 JLITOSL
0 głosów
odpowiedź 23 lutego 2020 przez Biedrzyk Nowicjusz (180 p.)

Witam ponownie, dopiero po kilku dniach przerwy mogłem znów zasiąść do tego zadania ale znów coś przekombinowałem :/
 

for (map<int,string>:: reverse_iterator ritr = inWords.rbegin() ; ritr != inWords.rend() ; ritr++)
    {
        if(liczba == ritr->first)
        {
            cout << ritr -> second;
        }
        if ((liczba > 20) && (liczba != ritr -> first))
        {
            do
            {
                wynik = liczba % mnoznik;
                //cout << "wynik: "<< wynik << endl;
                liczba = liczba - wynik;
                //cout << " liczba: " << liczba << endl;
                mnoznik *= 10;
                for (map<int,string>:: reverse_iterator ritr = inWords.rbegin() ; ritr != inWords.rend() ; ritr++)
                {
                    if(wynik == ritr -> first)
                    {
                        cout << ritr -> second << " ";
                    }
                    if(liczba == ritr -> first)
                    {
                        cout << ritr -> second << " ";
                    }
                    if((wynik >= 1000)&&(wynik < 1000000))
                    {
                        wynik /= 1000;
                        cout << "tys.";
                    }
                    if((wynik >= 1000000)&&(wynik < 1000000000))
                    {
                        wynik /= 1000000;
                        cout << "mln.";
                    }
                    if((wynik >= 1000000000)&&(wynik < 1000000000000))
                    {
                        wynik /= 1000000000;
                        cout << "mld.";
                    }
                    if((wynik >= 1000000000000)&&(wynik < 1000000000000000))
                    {
                        wynik /= 1000000000000;
                        cout << "bln.";
                    }
                }
            }
            while((wynik > 0)&&(liczba > 0));

Nie dość, że odczytuje od tyłu (tutaj rozumiem bo odcina po kolei liczby)to miesza się przy pełnych liczbach 12000000 itp. i dopisuje za często przedrostki tys. mln. itd :/

Podobne pytania

0 głosów
0 odpowiedzi 287 wizyt
0 głosów
2 odpowiedzi 1,174 wizyt
0 głosów
1 odpowiedź 207 wizyt
pytanie zadane 1 września 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 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!

...