NWD - zadanie i testy złośliwe :-)

0

Cześć,

mam takie zadanie:
http://solve.edu.pl/contests/download_desc/1994

I kod, który działał jeszcze 2 dni temu ale admin zmienił testy :-) i już nie działa :-)
Wysypuje się na jednym teście, prawdopodobnie gdzieś mi wychodzi wartość ujemna i wcześniej sprawdzaczka to puszczała ale teraz już nie :-)
Może ktoś widzi błąd?

#include<iostream>
using namespace std;
long long int NWD(long long int a, long long int b)
{
    long long int pom=0;
    while(b > 0)
    {
        pom = b;
        b = a%b;
        a = pom;
    }
    return a;
}
int main()
{
    long long  int c=0, a=0, b=0;
    cin>>c>>a>>b;
    if ((c<=a)||(c<=b))
        cout<<"NIE";
    else  if ((a/NWD(a,b)*b-1>=c)||(a/NWD(a,b)*b-1<0)||(a/NWD(a,b)*b==c))
        cout<<"NIE";
    else
        cout<<a/NWD(a, b)*b -1 ;
    return 0;
}

0

A jakieś informacje na temat tego testu, tudzież zwracany przezeń komunikat?

0
MasterBLB napisał(a):

A jakieś informacje na temat tego testu, tudzież zwracany przezeń komunikat?

Niestety tylko informacja - Błędna odpowiedź :-(
Jeszcze parę dni temu sprawdzanie czy wynik jest ujemny dostawał OK, ale testy zostały zmodyfikowane tak, aby takie rozwiązanie nie zostawało uznane.

0

Cóż, czeka cię Bracie debuggowanie, i rozpisywanie przypadków testowych. Wpierw jednak sugeruję poprawić program do wersji czytelniejszej:

#include<iostream>

using namespace std;

long long int NWD(long long int a, long long int b)
{
    long long int pom = 0;
    while (b > 0)
    {
        pom = b;
        b = a%b;
        a = pom;
    }
    return a;
}
int main()
{
    long long  int c = 0, a = 0, b = 0;
    cin >> c >> a >> b;

    if (c <= a) || c <= b)
    {
        cout << "NIE";
        return 0;
    }

    long long int result = a / NWD(a,b) * b;//tego wyrażenia używasz dużo razy, powtarzanie go zmniejsza czytelność kodu, no i jest zbyteczne
    if (result - 1 >= c || result - 1 < 0 || result == c)
    {
        cout << "NIE";
    }
    else
    {
        cout << result - 1;
    }
    return 0;
}

Następnie zapuszczasz dla opisanego w zadaniu przypadku testowego. Jak zadziała, to wymyślasz kolejne, wpierw rozwiązujesz je z palca na kartce. Na szybko patrząc c = 10 a = 2 b = 3 powinno dać taki sam wynik jak oryginalne dane. Kolejną obiecująco wyglądającą liczbą c jest 12, można dawać a i b równe 2, 3, 4, 6 w różnych kombinacjach - ale, to już ty Bracie obczajaj.
W pewnym momencie znajdziesz takie dane, dla których wynik wyliczony przez program wyjdzie inny niż to, co sam obliczysz. Wtedy łapiesz za debugger i dokładnie sprawdzasz funkcję NWD

0

Nauczyciel powie do M odlicz czyli na przykład Do 2 odlicz tak?

1 | 2 | 1 | 2 | 1 | 2 | 1 | 2
---------------- | -------------------

Teraz odliczanie jest od nowa tylko że druga osoba zaczyna liczyć

1 | 2 | 1 | 2 | 1 | 2 | 1 | 2
---------------- | -------------------
1 | 1 | 2 | 1 | 2 | 1 | 2 | 1

teraz osoby o tych samych numerach będą w tych samych grupach
czyli w grupie A jest 5 osob z numerem 1
w grupie B sa 3 osoby z numerem 2
Wiemy żę pewnie M bedzie rowne A lub B zalezy ile grup chce nauczyciel
Z drugiej strony chcą stanąć blisko siebie . no k..... serio ? SERIO ? to chyba ważniejsze żeby grali w jednej druzynie a nie stali blisko siebie moze jeszcze za reke niech sie trzymaja.

Jak widzisz zadanie jest źle sformułowane

0

Dziwne, że wywala się tylko na jednym teście (gdyby logika była skopana, to są szanse, że byłoby więcej błędów). Może w tym przypadku, dał tak duże liczby, że jest overflow w long long int result = a / NWD(a,b) * b;? Nie zaszkodzi Ci zmienić na unsigned long long int, powinien mieć większy zakres.

1 użytkowników online, w tym zalogowanych: 0, gości: 1