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

NWD z modulo

Aruba Cloud - Virtual Private Server VPS
+1 głos
1,509 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,138 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez mietek_arduino Początkujący (330 p.)
0 głosów
1 odpowiedź 280 wizyt
pytanie zadane 29 maja 2017 w C i C++ przez renticor Nowicjusz (160 p.)
0 głosów
1 odpowiedź 159 wizyt
pytanie zadane 21 marca 2017 w SPOJ przez chucksqll Stary wyjadacz (12,930 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...