Rashmistrz Temat założony przez niniejszego użytkownika |
Zamiana nieskończonej pętli for na pętlę while z warunkiem » 2014-10-14 19:03:06 Pisałem dla siebie algorytm Euklidesa wyszukujący największy wspólny dzielnik dwóch danych liczb... #include <iostream> int nwd( int l1, int l2 ) { for(;; ) { l1 > l2 ? l1 %= l2: l2 %= l1; if( l1 == 0 || l2 == 0 ) break; } return l1 == 0 ? l2: l1; } int main() { using namespace std; int a, b; cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: "; cin >> a; cout << "Podaj B: "; cin >> b; cout << "NWD: " << nwd( a, b ); return 0; }
Wszystko działało poprawnie, dopóki nie zechciałem wymienić: int nwd( int l1, int l2 ) { for(;; ) { l1 > l2 ? l1 %= l2: l2 %= l1; if( l1 == 0 || l2 == 0 ) break; } return l1 == 0 ? l2: l1; }
na: int nwd( int l1, int l2 ) { while( l1 || l2 ) { l1 > l2 ? l1 %= l2: l2 %= l1; } return l1 == 0 ? l2: l1; }
Chcę zrozumieć gdzie popełniłem błąd podczas wymiany... |
|
Memento96 |
» 2014-10-14 19:18:29 Brzydałby się jakiś break w tej pętli, ale ja się nie znam ;3 #include <iostream> int nwd( int l1, int l2 ) { while( l1 || l2 ) { l1 > l2 ? l1 %= l2: l2 %= l1; if( l1 || l2 == 0 ) break; } return l1 == 0 ? l2: l1; } int main() { using namespace std; int a, b; cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: "; cin >> a; cout << "Podaj B: "; cin >> b; cout << "NWD: " << nwd( a, b ); return 0; }
z ifem zwraca tego NWD :) |
|
pekfos |
» 2014-10-14 20:16:42 |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2014-10-14 20:59:03 Brzydałby się jakiś break w tej pętli, |
i był... Tylko że ja przeniosłem te przerwanie do warunku pętli while i coś z tym nie styka właśnie. :F z ifem zwraca tego NWD :) |
Żeby nie było ogromnego OFF-Topu: "IF arytmetyczny"//w edycjii@pekfos *facepalm* Zapomniałem, że w warunku jest kiedy pętla ma się wykonywać, a nie kiedy zakończyć. :F Do tego można przytoczyć: Jak się nie nauczę sam błędów szukać to kiepski programista ze mnie będzie. :/ |
|
Memento96 |
» 2014-10-15 19:51:59 A kto powiedział, że sam się od razu nauczysz tego? ;)
Ja np. dzisiaj chciałem z pustej tablicy przypisać do pełnej zamiast robić na odwrót ;x
btw. po co sobie utrudniać życie i modyfikować program ktory działa prawidłowo? ;3 |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2014-10-15 21:12:41 btw. po co sobie utrudniać życie i modyfikować program ktory działa prawidłowo? ;3 |
Po prostu lubię zgrabny kod. ^_^ Pekfos mi powiedział, że moje poprawki to znaczący przerost formy nad treścią. |
Hahah... Przypomniało mi się jak Allegro kodem PHP pluło i tam pisało: // tymczasowo dla pierwszego etapu checkout |
... a zostało na zawsze. xD Ja np. dzisiaj chciałem z pustej tablicy przypisać do pełnej zamiast robić na odwrót ;x |
Ja raz nie zainicjowałem tablicy i poprosiłem o pomoc, którą później "ślepo" przeczytałem. :C ( [lekcja 30] Zagnieżdżanie pętli. (zadania)) |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2014-10-18 20:42:55 //WTF? Jakim cudem mój post stał się pusty? O_o Serdecznie dziękuję za pomoc. Mój kod ostatecznie wygląda tak: #include <iostream> int nwd( int l1, int l2 ) { bool ujemna = l1 < 0 && l2 < 0 ? true: false; l1 > 0 ? l1 =+ l1: l1 =- l1; l2 > 0 ? l2 =+ l2: l2 =- l2; while( l1 && l2 ) l1 > l2 ? l1 %= l2 : l2 %= l1; return l1 == 0 ?( ujemna ? - l2: l2 ) :( ujemna ? - l1 : l1 ); } int main() { using namespace std; int a, b; cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: "; cin >> a; cout << "Podaj B: "; cin >> b; cout << "NWD: " << nwd( a, b ); return 0; }
Nie zamierzam zabezpieczyć go przed wpisaniem błędnych danych, bo ma tylko służyć na pokaz, a nie do normalnego działania w jakimś programie. |
|
Rashmistrz Temat założony przez niniejszego użytkownika |
» 2014-10-19 11:18:27 Mała poprawka. C: Największym wspólnym dzielnikiem liczb a, b, nazywa się taką nieujemną liczbę [...] |
#include <iostream> int nwd( int l1, int l2 ) { l1 > 0 ? l1 =+ l1: l1 =- l1; l2 > 0 ? l2 =+ l2: l2 =- l2; while( l1 && l2 ) l1 > l2 ? l1 %= l2 : l2 %= l1; return l1 == 0 ? l2: l1; } int main() { using namespace std; int a, b; cout << "Wylicze najwiekszy wspolny dzielnik A i B...\nPodaj A: "; cin >> a; cout << "Podaj B: "; cin >> b; cout << "NWD: " << nwd( a, b ); return 0; } |
|
« 1 » |