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

[SPOJ] JLITOSL - Liczba na słowo - "Błedna odpowiedz"

Object Storage Arubacloud
0 głosów
258 wizyt
pytanie zadane 7 kwietnia 2020 w SPOJ przez milosz123 Użytkownik (720 p.)
zmienione kategorie 7 kwietnia 2020 przez Patrycjerz

Witam jestem początkującym programistą i mam pewien problem z zadaniem ze spoja. Szczerze mówiąc nie mam pojęcia dlaczego dostaję błąd, ponieważ dla wszystkich przypadków które sprawdziłem zadanie działa poprawnie.

Proszę o pomoc.

#include<iostream>
#include <cmath>

using namespace std;

string slowa(long long a)
{
    string napis;

    if ((a >= 900)&&(a < 1000))
    {
        napis += "dziewiecset ";
        a = a % 100;
    }
    else if ((a >= 800)&&(a < 900))
    {
        napis += "osiemset ";
        a = a % 100;
    }
    else if ((a >= 700)&&(a < 800))
    {
        napis += "siedemset ";
        a = a % 100;
    }
    else if ((a >= 600)&&(a < 700))
    {
        napis += "szescset ";
        a = a % 100;
    }
    else if ((a >= 500)&&(a < 600))
    {
        napis += "piecset ";
        a = a % 100;
    }
    else if ((a >= 400)&&(a < 500))
    {
        napis += "czterysta ";
        a = a % 100;
    }
    else if ((a >= 300)&&(a < 400))
    {
        napis += "trzysta ";
        a = a % 100;
    }
    else if ((a >= 200)&&(a < 300))
    {
        napis += "dwiescie ";
        a = a % 100;
    }
    else if ((a >= 100)&&(a < 200))
    {
        napis += "sto ";
        a = a % 100;
    }

    if ((a >= 90)&&(a < 100))
    {
        napis += "dziewiecdziesiat ";
        a = a % 10;
    }
    else if ((a >= 80)&&(a < 90))
    {
        napis += "osiemdziesiat ";
        a = a % 10;
    }
    else if ((a >= 70)&&(a < 80))
    {
        napis += "siedemdziesiat ";
        a = a % 10;
    }
    else if ((a >= 60)&&(a < 70))
    {
        napis += "szescdziesiat ";
        a = a % 10;
    }
    else if ((a >= 50)&&(a < 600))
    {
        napis += "piecdziesiat ";
        a = a % 10;
    }
    else if ((a >= 40)&&(a < 50))
    {
        napis += "czterdziesci ";
        a = a % 10;
    }
    else if ((a >= 30)&&(a < 40))
    {
        napis += "trzydziesci ";
        a = a % 10;
    }
    else if ((a >= 20)&&(a < 30))
    {
        napis += "dwadziescia ";
        a = a % 10;
    }

    if (a == 19) napis += "dziewietnascie ";
    else if (a == 18) napis += "osiemnascie ";
    else if (a == 17) napis += "siedemnascie ";
    else if (a == 16) napis += "szesnascie ";
    else if (a == 15) napis += "pietnascie ";
    else if (a == 14) napis += "czternascie ";
    else if (a == 13) napis += "trzynascie ";
    else if (a == 12) napis += "dwanascie ";
    else if (a == 11) napis += "jedynascie ";
    else if (a == 10) napis += "dziesiec ";
    else if (a == 9) napis += "dziewiec ";
    else if (a == 8) napis += "osiem ";
    else if (a == 7) napis += "siedem ";
    else if (a == 6) napis += "szesc ";
    else if (a == 5) napis += "piec ";
    else if (a == 4) napis += "cztery ";
    else if (a == 3) napis += "trzy ";
    else if (a == 2) napis += "dwa ";
    else if (a == 1) napis += "jeden ";

    return napis;
}

string liczba_na_slowa(long long a)
{
    string napis;
    double b;

    if (a == 0)
    {
        napis += "zero";
        return napis;
    }

    while (a > 0)
    {
        if (a >= 1000000000000)
        {
            b = a / 1000000000000;
            napis += slowa(b);
            napis += "bln. ";
            a = a % 1000000000000;
            cout << a << endl;
        }
        else if (a >= 1000000000)
        {
            b = a / 1000000000;
            napis += slowa(b);
            napis += "mld. ";
            a = a % 1000000000;
            cout << a << endl;
        }
        else if (a >= 1000000)
        {
            b = a / 1000000;
            napis += slowa(b);
            napis += "mln. ";
            a = a % 1000000;
            cout << a << endl;
        }
        else if (a >= 1000)
        {
            b = a / 1000;
            napis += slowa(b);
            napis += "tys. ";
            a = a % 1000;
            cout << a << endl;
        }
        else if (a >= 1)
        {
            napis += slowa(a);
            a = 0;
        }
    }

    int c = napis.length();
    napis[c-1] = '\0';
    return napis;
}

int main()
{
    int n;
    long long a;

    cin >> n;

    for (int i=0; i<n; i++)
    {
        cin >> a;
        string napis = liczba_na_slowa(a);
        cout << napis << "\n";
    }

    return 0;
}

 

3 odpowiedzi

0 głosów
odpowiedź 7 kwietnia 2020 przez j23 Mędrzec (194,920 p.)
    int c = napis.length();
    napis[c-1] = '\0';

A po co to cudo? 8|

std::string sam zadba o to, by na końcu było zero.

Po co w liczba_na_slowa wysyłasz cokolwiek na standardowe wyjście?

 

0 głosów
odpowiedź 7 kwietnia 2020 przez Patrycjerz Mędrzec (192,320 p.)
  1. if (a == 0)
    {
        napis += "zero";
        return napis;
    }

    Wg treści zadania zero nie może zostać wprowadzone do programu.

  2. double b;

    Dlaczego używasz typu zmiennoprzecinkowego? Możesz przez to utracić dokładność przy dużych liczbach całkowitych.

  3. int c = napis.length();
    napis[c-1] = '\0';

    Aby usunąć spację z końca napisu, lepiej użyć std::string::substr. Sposób z zerem może nie zadziałać na wszystkich środowiskach.

    return napis.substr(0, napis.length() - 1);
  4. cout << a << endl;

    Rozumiem, że to jakieś debugi i w końcowym kodzie tego nie ma?

  5. else if (a == 11) napis += "jedynascie ";

    Poprawną formą tego słowa jest "jedenaście".

komentarz 8 kwietnia 2020 przez milosz123 Użytkownik (720 p.)
Dziękuję za pomoc program działa
0 głosów
odpowiedź 7 kwietnia 2020 przez Whistleroosh Maniak (56,980 p.)
Poza tym co zostało już powiedziane musisz jeszcze zamienić wszystkie 1000000000000 z if'a zaczynającego się w 133. linii na 1000000000000LL, bo inaczej dostaniesz błąd kompilacji
komentarz 7 kwietnia 2020 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli użyjesz literału całkowitego bez żadnego sufiksu, kompilator wybierze pierwszy typ, w który dana wartość się zmieści, nie jest to więc błąd.
komentarz 8 kwietnia 2020 przez Whistleroosh Maniak (56,980 p.)
Wysyłałem ten kod na SPOJa i bez sufiksu dawał błąd
komentarz 8 kwietnia 2020 przez milosz123 Użytkownik (720 p.)
Dziękuję za pomoc program działa

Podobne pytania

0 głosów
0 odpowiedzi 287 wizyt
0 głosów
2 odpowiedzi 1,175 wizyt
0 głosów
2 odpowiedzi 580 wizyt
pytanie zadane 17 lutego 2020 w C i C++ przez Biedrzyk Nowicjusz (180 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!

...