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

Liczby na słowo - zadanie SPOJ

Object Storage Arubacloud
0 głosów
146 wizyt
pytanie zadane 22 lutego 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)

Mam problem z pewnym zadaniem ze SPOJa. Dla wszystkich przypadków, które sprawdziłem, działa poprawnie. Mimo to SPOJ nadal jest nieugięty

#include <iostream>
#include <string>

using namespace std;

int t, licznik, zero;
string liczba;

int main()
{
    cin>>t;
    for(int i=0; i<t; i++)
    {
        cin>>liczba;
        licznik=0;
        zero=0;
        for(int j=0; j<liczba.length(); j++)
        {
            switch(liczba[j])
            {
            case '1':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"sto ";
                else if ((liczba.length()-j)%3==2)
                {
                    switch(liczba[j+1])
                    {
                    case '1':
                        cout<<"jedenascie ";
                        break;
                    case '2':
                        cout<<"dwanascie ";
                        break;
                    case '3':
                        cout<<"trzynascie ";
                        break;
                    case '4':
                        cout<<"czternascie ";
                        break;
                    case '5':
                        cout<<"pietnascie ";
                        break;
                    case '6':
                        cout<<"szesnascie ";
                        break;
                    case '7':
                        cout<<"siedemnascie ";
                        break;
                    case '8':
                        cout<<"osiemnascie ";
                        break;
                    case '9':
                        cout<<"dziewietnascie ";
                        break;
                    case '0':
                        cout<<"dziesiec ";
                        break;
                    }
                }
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"jeden ";
                }
                break;
            }
            case '2':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"dwiescie ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"dwadziescia ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"dwa ";
                }
                break;
            }
            case '3':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"trzysta ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"trzydziesci ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"trzy ";
                }
                break;
            }
            case '4':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"czterysta ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"czterdziesci ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"cztery ";
                }
                break;
            }
            case '5':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"piecset ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"piecdziesiat ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"piec ";
                }
                break;
            }
            case '6':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"szescset ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"szescdziesiat ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"szesc ";
                }
                break;
            }
            case '7':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"siedemset ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"siedemdziesiat ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"siedem ";
                }
                break;
            }
            case '8':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"osiemset ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"osiemdziesiat ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"osiem ";
                }
                break;
            }
            case '9':
            {
                if ((liczba.length()-j)%3==0)
                    cout<<"dziewiecset ";
                else if ((liczba.length()-j)%3==2)
                    cout<<"dziewiecdziesiat ";
                else
                {
                    if(liczba[j-1]!='1')
                        cout<<"dziewiec ";
                }
                break;
            }
            }
            if((liczba[j]!='0')||(licznik>0))
                licznik++;
            else
                zero++;
            if(((liczba.length()-j-1)%3==0)&&(licznik>0))
            {
                switch((liczba.length()-j-1)/3)
                {
                case 1:
                    cout<<"tys. ";
                    break;
                case 2:
                    cout<<"mln. ";
                    break;
                case 3:
                    cout<<"mld. ";
                    break;
                case 4:
                    cout<<"bln. ";
                    break;
                }
            }
            if(zero==liczba.length())
                cout<<"zero ";
        }
        cout<<endl;
    }
    return 0;
}

 

1 odpowiedź

+1 głos
odpowiedź 22 lutego 2021 przez Whistleroosh Maniak (56,980 p.)
wybrane 22 lutego 2021 przez Rainbow99
 
Najlepsza
Z tego co na szybko przetestowałem to Twój program wyświetla czasami za dużo sufiksów. Zobacz sobie co się dzieje dla liczb: 5000000, 5000000000
komentarz 23 lutego 2021 przez Billy Użytkownik (680 p.)

Oznaczam miejsca, żebyś nie zaspojlerował sobie rozwiązania, jeśli chcesz się sam zmierzyć z problemem dla przypadków podanych przez Whistleroosh'a.

UWAGA POMYSŁ NA ROZWIĄZANIE:
Jak robiłem to zadanie, to miałem ten sam problem. Musisz sprawdzać, czy (jeśli w wyrazie jest więcej niż jedna "kropka" (ja u siebie podzieliłem wyraz kropkami, tak jak się rozdziela liczby (np. 10.000.000)) i jeśli tak, to wtedy sprawdzasz, czy występują trzy 0 pod rząd od danej "kropki". Myślę, że twój kod da się dopasować do tego sposobu nawet bez wstawiania kropek, dla mnie było tak po prostu wygodniej.

UWAGA SPOJLER KODU:
Sam rozwiązałem to tak:

if(kropka-1!=0 && (number[j-1]=='0' && number[j-2]=='0' && number[j-3]=='0'))

IF (kropka nie jest pierwszą kropką (jest >= od 1.000.000, żeby nie wyjść z zakresu) AND trzy poprzednie liczby są równe zero) - nie wstawiaj sufiksa. If sprawdza, jeśli natrafi na "kropkę" w liczbie 

 

Podobne pytania

0 głosów
1 odpowiedź 206 wizyt
pytanie zadane 1 września 2020 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
0 odpowiedzi 285 wizyt
0 głosów
2 odpowiedzi 577 wizyt
pytanie zadane 17 lutego 2020 w C i C++ przez Biedrzyk Nowicjusz (180 p.)

92,566 zapytań

141,420 odpowiedzi

319,615 komentarzy

61,952 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!

...