• 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

0 głosów
308 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 (57,400 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ź 481 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 433 wizyt
0 głosów
2 odpowiedzi 857 wizyt
pytanie zadane 17 lutego 2020 w C i C++ przez Biedrzyk Nowicjusz (180 p.)

93,762 zapytań

142,717 odpowiedzi

323,368 komentarzy

63,359 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...