Co w tym kodzie jest błędne? C++


(enedil) #1

Hej!

Robiłem zadanie ze SPOJa. Mój kod działa na wszystkich moich przykładach jednak jest odrzucony jako błędny (zły wynik). Czym może być to spowodowane? Kompilator u nich na serwerze, to G++ 4.3.2. Oto mój kod:

#include <iostream>
#include <string>

using namespace std;

int main() {
    ios_base::sync_with_stdio(0); //Usuwa problemy z wydajnością.
    int t, a;
    int wynik = 1;
    string s;
    cin >> t; //Liczba przypadków testowych.
    while(t) {
        cin >> a; //Pierwsza liczba, w moim rozwiązaniu zbyteczna.
        cin.ignore(10, ' '); //Usuwam zawartość bufora, aby uniknąć błędnego odczytu przez getlne
        getline(cin, s);
        if (s[0] == '?') //Jeżeli pierwsza cyfra jest znakiem zapytania, to wynik jest mnożony razy 9
            wynik *= 9;
        for (int i = 1; i < s.length(); ++i) {
            if (s[i] == '?') {
                wynik *= 10; //Jeżeli każda kolejna, to ynik jest mnożony razy 10
            }
        }
        cout << wynik << endl;
        wynik = 1; //Przywrócenie początkowego stanu wyniku
        t--;
    }
    return 0;
}

(kostek135) #2

IN

1
2 ??

Twój out

90

jak dla mnie istnieje 100 różnych liczb, które można wstawić

00
01
02
...
10
11
..
98
99

EDIT


(Grzelix) #3

Tak jak przedmówca napisał problemem jest zapewne to że wynik chcesz trzymać w typie int. Dla dużego n jest to nie możliwe.

 

Podpowiedź: Weź kartkę i napisz:

przykład dla jednego znaku zapytania - zapisz wynik

następnie dla dwóch znaków zapytania - zapisz wynik

… rób tak aż zauważysz jakąś zależność. 

 

Zacznij od przypadku kiedy znak zapytania nie jest na początku liczby.

Potem metodą kartki i ołówka sprawdź wyniki kiedy jest na początku liczby.

 

Powodzenia.


(enedil) #4

Już znalazłem błąd. Nie dotyczy wspomnianej zbyt małej wielkości inta czy nawet long longa. Dużo może wam wyjaśnić prawidłowy input i output:

In:

1

5 ?12345

Out:

1


(kostek135) #5

Nie, żeby coś, ale to wejście nie jest zgodne z treścią zadania

 

Jak rozumiem chodziło o

1
6 ?12345

I tu raczej nie ma wątpliwości, że jest to 9

Jak na moje mogłeś jeszcze nie uwzględnić prostego

1
1 ?

gdzie nie powinieneś zwracać 9, a 10, bo 0 jest wtedy poprawne w zapisie dziesiętnym liczby (chyba? zadanie nie jest dobrze uściślone co jest, a co nie jest poprawną liczbą, tak więc to moje domysły).


(enedil) #6

Czytałem w komentarzach i u nich na forum, że to jest interpretowane jako liczba n-cyfrowa, czyli w moim przykładzie

5 ?12345

Musi zwrócić 1, a cyfrą w miejscu ? jest 0.


(kostek135) #7

Okej można mówić, że 012345 jest liczbą 5-cio cyfrową i z tym się zgadzam. Ale…

.