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

Nwd metoda parzystosci

Object Storage Arubacloud
0 głosów
210 wizyt
pytanie zadane 29 maja 2017 w C i C++ przez renticor Nowicjusz (160 p.)

Witam mam mały problem z przekształceniem pseudo kodu w program.

Jest to Algorytm euklidesa :

Read (a,b) 

while(b>0) do

begin

     if (a<b) then zamien (a,b)

     if (parzyste(a) and parzyste(b)) then

           begin 

                a:=a div 2;

                b:=b div 2;

           end;

     else

     if (parzyste(a) and not parzyste(b)) then a:=a div 2; else

     if (not parzyste(a) and parzyste(b)) then b:=b div 2; else

     a:=a-b;

end;

Write(a);

div to dzielenie całkowite, parzyste sprawdza czy liczba jest parzysta .

Mając taki kod dla danych wejściowych 50 i 10 dostaję błędny wynik 5 

int euklides_3(int a,int b)
{
    if(a<b && a+b<0)
        return -1;
        
    while (b>0)
    {
        if(a<b)swap(a,b);
        if(a%2==0 && b%2==0)
        {
            a=a/(2);
            b=b/(2);
        }
        else if(a%2==0 && b%2!=0)
            {
                a=a/(2);
            }
            else if(a%2!=0 && b%2==0)
                {
                    b=b/(2);
                }
                else
                {
                    a=a-b;
                }
    }

    return a;
}

Jakieś podpowiedzi?? Byłbym wdzięczny.

komentarz 29 maja 2017 przez d0n Mądrala (6,440 p.)
Jak na moje to i ten pseudokod i  ten kod zwracaja nwd podzielone tyle razy przez dwa, jak dlugo sa przez niepodzielne

1 odpowiedź

0 głosów
odpowiedź 29 maja 2017 przez OfftheCode Gaduła (4,050 p.)

Jeżeli oczekiwałeś wyniku 25 to zauważ, że Twoja pętla while(b>0) nie kończy się po pierwszym przejściu. Przyjrzyj się temu kodu tutaj i zobacz co się dzieje w poszczególnych iteracjach, myślę, że zrozumiesz gdzie leży błąd, w razie co pisze dalej:

#include <iostream>

using namespace std;

int euklides_3(int a,int b);


int main() {
    cout<<euklides_3(50,10);
    return 0;
}

int euklides_3(int a, int b) {
    int iterator = 1;
    while(b>0){
        cout<<"wartosc b "<<b<<endl;
        cout<<"wartosc a "<<b<<endl;
        if(a<b){
            swap(a,b);
        }
        if(a%2==0 && b%2==0){
            a=a/2;
            b=b/2;
        }
        else if(a%2==0 && b%2!=0){
            a=a/2;
        }
        else if(a%2!=0 && b%2==0){
            b=b/2;
        }
        else{
            a=a-b;
        }
        cout<<"iteracja "<<iterator<<endl;
        cout<<"wartosc b po przejsciu petli"<<b<<endl;
        cout<<"wartosc a po przejsciu petli"<<b<<endl;
        iterator++;
    }

    return a;
}

 

komentarz 29 maja 2017 przez renticor Nowicjusz (160 p.)
NWD największy wspólny dzielnik. Spodziewałem się 10 a dostałem 5 pętla wykonuje się o raz za dużo, ale jest tak jak w pseudokodzie .
komentarz 29 maja 2017 przez OfftheCode Gaduła (4,050 p.)
tak wiem czym jest NWD, ale spójrz na warunki jakie stawiasz.
komentarz 29 maja 2017 przez renticor Nowicjusz (160 p.)

Sory zdziwiło mnie gdy napisałeś o 25 i wkurzyło bo siedzę nad tym już dłuższy czas . Mam już działający kod tylko różni się od pseudokodu ... Dzięki za pomoc yes

komentarz 29 maja 2017 przez OfftheCode Gaduła (4,050 p.)
Nie ma sprawy, właśnie nie do końca rozumiałem jego działanie, ale nie byłem pewien czy sam dobrze rozumuje xd

Podobne pytania

+1 głos
1 odpowiedź 1,177 wizyt
pytanie zadane 15 kwietnia 2018 w C i C++ przez Hikori Nowicjusz (180 p.)
0 głosów
1 odpowiedź 3,818 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez mietek_arduino Początkujący (330 p.)
0 głosów
1 odpowiedź 133 wizyt
pytanie zadane 21 marca 2017 w SPOJ przez chucksqll Stary wyjadacz (12,930 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!

...