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

NWD z modulo

Object Storage Arubacloud
+1 głos
1,176 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ź 3,817 wizyt
pytanie zadane 3 kwietnia 2018 w C i C++ przez mietek_arduino Początkujący (330 p.)
0 głosów
1 odpowiedź 210 wizyt
pytanie zadane 29 maja 2017 w C i C++ przez renticor Nowicjusz (160 p.)
0 głosów
1 odpowiedź 133 wizyt
pytanie zadane 21 marca 2017 w SPOJ przez chucksqll Stary wyjadacz (12,930 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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!

...