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

NWD z modulo

+1 głos
1,558 wizyt
pytanie zadane 15 kwietnia 2018 w C i C++ przez Hikori Nowicjusz (180 p.)

Witam,
Na wstępie chciałbym powiedzieć tylko, że dopiero zacząłem swoją przygodę z programowaniem i prosiłbym o wyrozumiałość.
Jeśli chodzi o mój problem, to mianowicie dostałem zadanie aby napisać prosty algorytm, który policzy NWD z modulo dla liczb całkowitych i liczyć ilość kroków wykonanych przez algorytm (pętli). Udało mi się to zrobić, jednak algorytm ma też liczyć NWD dla liczb ujemncych, co niestety mi nie wyszło. Pomimo zastosowania wartości bezwzględnej nadal NWD pokazuje mi ujemny wynik. Czy moglibyście mi pomóc bądź coś podpowiedzieć? Załączam swój algorytm, treść zadania i z góry dziękuję za pomoc.

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
int abs_liczba1, abs_liczba2,t, kroki=0;// t - zapamietuje dzielnik
        cout <<"Podaj pierwsza liczbe: ";

while (not(cin >> abs_liczba1))
        {
        cout <<"Podaj pierwsza liczbe: ";
        cin.clear();
        cin.sync();
        }
        cin.clear();
        cin.sync();
        cout <<"Podaj druga liczbe: ";

while (not(cin >> abs_liczba2))
        {
        cout <<"Podaj druga liczbe: ";
        cin.clear();
        cin.sync();
        }
        cin.clear();
        cin.sync();

if (abs_liczba1==0 || abs_liczba2==0)
       {
        cout<<"NWD nieokreslone" <<endl;
        return 0;
        }
do
{
    t=abs_liczba2;
    abs_liczba2=abs_liczba1%abs_liczba2;
    abs_liczba1=t;
    kroki++;
}
while (abs_liczba2!= 0);

    cout<<"Najwiekszy wspolny dzielnik: "<<abs_liczba1<<endl;
    cout<<"Ilosc krokow: "<<kroki<<endl;
    return 0;
}

komentarz 15 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Pomimo zastosowania wartości bezwzględnej

Gdzie w tym kodzie jest stosowana wartość bezwzględna? 

komentarz 15 kwietnia 2018 przez Hikori Nowicjusz (180 p.)
liczba1=abs(liczba1);
liczba2=abs(liczba2);


Po dodaniu tych dwóch linijek zaczęło działać. Dobrze zrobiłem czy jeszcze coś powinienem zmienić? 

komentarz 15 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

@Hikori,

Gdzie w tym kodzie jest liczony NWD?

komentarz 15 kwietnia 2018 przez Hikori Nowicjusz (180 p.)
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
for( int licznik = 1; licznik > 0; licznik++ )
{
int liczba1, liczba2, kroki;
{
        cout <<"Podaj pierwsza liczbe: ";
        while (not(cin >> liczba1))
        {
        cout <<"Podaj pierwsza liczbe: ";
        cin.clear();
        cin.sync();
        }
        cin.clear();
        cin.sync();
        cout <<"Podaj druga liczbe: ";

while (not(cin >> liczba2))
        {
        cout <<"Podaj druga liczbe: ";
        cin.clear();
        cin.sync();
        }
        cin.clear();
        cin.sync();
if (liczba1==0 || liczba2==0)
       {
        cout<<"NWD nieokreslone" <<endl;
        return 0;
        }
    else

if (liczba1 == liczba2)
        {
        cout <<"Najwiekszy wspolny dzielnik: "<< liczba1 << endl << endl;
        }

if (liczba1>0 and liczba2==0)
        {
       cout <<"Najwiekszy wspolny dzielnik: "<< liczba1 << endl << endl;
        }
        if (liczba1==0 and liczba2>0)
        {
        cout <<"Najwiekszy wspolny dzielnik: "<< liczba2 << endl << endl;
        }
}
do
{
        if(liczba2>liczba1) liczba2=liczba2-liczba1;
        else liczba1=liczba1-liczba2;
        kroki=log2(liczba1+liczba2);
}
while (liczba2!=liczba1);
        cout <<"Najwiekszy wspolny dzielnik: " <<liczba2 <<endl;
        cout <<"Ilosc krokow: " << kroki << endl;

cout<<endl<<endl;
{
int     liczba1, liczba2,t, kroki=0;// t - zapamietuje dzielnik
        cout <<"Podaj pierwsza liczbe: ";

while (not(cin >> liczba1))
        {
        cout <<"Podaj pierwsza liczbe: ";
        cin.clear();
        cin.sync();
        }
        cin.clear();
        cin.sync();
        cout <<"Podaj druga liczbe: ";

while (not(cin >> liczba2))
        {
        cout <<"Podaj druga liczbe: ";
        cin.clear();
        cin.sync();
        }
        cin.clear();
        cin.sync();

if (liczba1==0 || liczba2==0)
       {
        cout<<"NWD nieokreslone" <<endl;
        return 0;
        }
do
{
    t=liczba2;
    liczba2=liczba1%liczba2;
    liczba1=t;
    liczba1=abs(liczba1);
    liczba2=abs(liczba2);
    kroki++;
}
while (liczba2!= 0);

    cout<<"Najwiekszy wspolny dzielnik: "<<liczba1<<endl;
    cout<<"Ilosc krokow: "<<kroki<<endl;
    return 0;
}
}
}

Proszę ale po dodaniu NWD, nie działa w ogóle program. Zacina się po wpisaniu liczb

1 odpowiedź

0 głosów
odpowiedź 15 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

A może coś takiego zadziała?

#include <iostream>
using namespace std;

int myGCD(int n1, int n2)
{
    for(;n1 != n2; n1 > n2 ? n1 -= n2 : n2 -= n1);

    return n1;
}

int main()
{
    int n1, n2;

    cout << "Enter two numbers separated by space: ";

    cin >> n1 >> n2;

    cout << "GCD " << n1 << " and "
         << n2 << " -> " << myGCD(n1, n2) << '\n';
}

 

Podobne pytania

0 głosów
1 odpowiedź 4,188 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez mietek_arduino Początkujący (330 p.)
0 głosów
1 odpowiedź 295 wizyt
pytanie zadane 29 maja 2017 w C i C++ przez renticor Nowicjusz (160 p.)
0 głosów
1 odpowiedź 164 wizyt
pytanie zadane 21 marca 2017 w SPOJ przez chucksqll Stary wyjadacz (12,930 p.)

93,425 zapytań

142,421 odpowiedzi

322,646 komentarzy

62,787 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...