[Algorytmy] 2 wiaderka

Awatar użytkownika
tomaszek92
Użytkownik
Użytkownik
Posty: 79
Rejestracja: 11 kwie 2011, o 17:26
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 1 raz
Pomógł: 2 razy

[Algorytmy] 2 wiaderka

Post autor: tomaszek92 »

Witam
Mam problem z napisaniem algorytmu do następującego zadania: mamy basen z nieskończoną ilością wody i dwa wiadra o pojemnościach x,y-naturalne. Trzeba napełnić inny basen dokładnie z- naturalne litrami wody. Algorytm ma mówić, czy da się to zrobić dla dowolnych wprowadzonych x,y,z, a jeśli tak to w jaki sposób.
Jedyne co to udało mi się ustalić, że NWD(x,y) musi się równać wielokrotności liczby z.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[Algorytmy] 2 wiaderka

Post autor: Afish »

Poczytaj o rozszerzonym algorytmie Euklidesa.
daro256
Użytkownik
Użytkownik
Posty: 21
Rejestracja: 2 lis 2006, o 17:20
Płeć: Mężczyzna
Lokalizacja: Kołobrzeg
Pomógł: 1 raz

[Algorytmy] 2 wiaderka

Post autor: daro256 »

Proponuję takie rozwiązanie (kod poniżej). Zakładam, że wiadro1 jest większe niż wiadro2. W programie można to łatwo ustalić, a potrzebne jest to aby zacząć od większego wiadra... Zmienne nazywam inaczej niż x,y,z aby było bardziej przejrzyście.

Kod: Zaznacz cały

int wiadro1, wiadro2, basen; // zmienne z pojemnościami
int licznik1 = 0, licznik2 = 0; //liczniki wiader
int pomoc; //zmienna pomocnicza

if(basen%wiadro1==0) // % oznacza dzielenie modulo
  //sprawa zalatwiona pierwszym wiadere
else if(basen%wiadro2==0)
  //sprawa załatwiona drugim wiadrem
else
{
  pomoc = basen-wiadro1; //zaczynamy od większego wiadra
  licznik1++; //zwiekszamy licznik od wiadra1
  while (pomoc > 0)
  {
    if(pomoc%wiadro1==0) //sprawdzamy czy to co zostalo dzieli sie przez poj wiadra1
    {
      pomoc = pomoc - wiadro1;
      licznik1++; //jezeli tak uzywamy wiekszego wiadra i zwiekszamy odpowiedni licznik
    }
    else if(pomoc%wiadro2==0) //to samo co wyzej tylko ze dla mniejszego wiadra
    {
      pomoc = pomoc - wiadro2;
      licznik2++;
    }
    else
    {
      licznik1--;
      break;
 //jezeli powyzsze dwa warunki nie zostaly spelnione oznacza to ze nie da sie zrealizowac zadania za pomoca podanych wiader, wiec przerywamy petle
    }
  }
}

Po zakończeniu działania programu, wartości liczników będą nas informować o tym jak zrealizować zadanie, jeżeli pozostaną one na pozycjach zerowych, tzn. że nie da się zrealizować zadania.
Nie powinno być problemu z przetłumaczeniem programu na schemat blokowy.
ODPOWIEDZ