Algorytm Euklidesa i liczby ujemne

Algorytm Euklidesa i liczby ujemne
SH
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 lata
  • Postów:18
0

Mam pytanie odnośnie jak zrobić, aby mój program się nie wywalał gdy wpiszemy do niego liczbę ujemną.

Kopiuj
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#pragma warning( push, 4 )
int main(void)
{
    (void)setlocale(LC_ALL, "pl-PL");

    unsigned long long a = 0, b = 0;
    while (a <= 0)
    {
        while (1)
        {
            printf("Podaj pierwsza liczbe \n");
            if (scanf("%llu", &a) == 1)break;
            else printf("Błąd wprowadzania");
            fseek(stdin, 0, SEEK_END);
        }
        if (a == 0)
        {
            printf("Liczba nie moze rowna byc 0!");
        }
    }
    while (b <= 0) {
        while (1)
        {
            printf("Podaj druga liczbe \n");
            if (scanf("%llu", &b) == 1)break;
            else printf("Błąd wprowadzania");
            fseek(stdin, 0, SEEK_END);
        }
        if (b == 0)
        {
            printf("Liczba nie może być rowna 0");
        }
    }

    while (a != b)
    {
        if (a > b)
        {
            a = a - b;
        }
        else
        {
            b = b - a;
        }
    }
    printf("%llu", a);







    return EXIT_SUCCESS;
}
#pragma warning(pop)
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:2 miesiące
3

Zastąpić NWD na sensowną wersję z modulo.
Lub przejść na C++ i użyć wersji z std::
Lub przed pętlą a=abs(a); b=abs(b);
Moment, on nie zawiesza się tylko odejmuje po kilku godzinach policzy.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon
SH
Właśnie wersja z modulo ma być pominięta bo byłoby za łatwo
_13th_Dragon
Podaj zamiast a - 1844674407370955161 zaś zamiast b - 2 i policz czas odpowiedzi.
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
2

Ja był zalecił jak najszybciej nauczyć się definiować małe funkcję.
Łatwiej: czytać, poprawiać, testować.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
ZD
  • Rejestracja:około 3 lata
  • Ostatnio:ponad rok
  • Postów:2310
1
Shiffter napisał(a):

Mam pytanie odnośnie jak zrobić, aby mój program się nie wywalał gdy wpiszemy do niego liczbę ujemną.

Zabezpieczyć, początek zabezpieczeń masz niezły, to twój kod czy pożyczony ?

Kopiuj
            if (scanf("%llu", &a) == 1 && a>= 1 )break;

ps. pomijam wypowiedź co do zgłaszanych przez kolegów dylematów, tylko wąsko


If you put a million monkeys at a million keyboards, one of them will eventually write a Java program - the rest of them will write Perl
_13th_Dragon
Niby jakim cudem unsigned long long może okazać się ujemnym? Z zerami OP nie ma problemów bo jest zabezpieczone: if(a==0) ....
_13th_Dragon
Niektóre kompilatory pozwalają na scanf("%llu", &a) podać np : -1 wtedy dostajemy "nieodpowiedną" wartość dodatnią.
SH
@_13th_Dragon Właśnie o to chodzi, ludzie od mnie mapowali liczbę ujemną i zmieniali ją na Stringa dalszych działań jakie podjęli nie pamiętam
SH
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 lata
  • Postów:18
0

to twój kod czy pożyczony ?

I tak i nie, wykładowca od ćwiczeń zarzucił pomysł, jakby to można było zabezpieczyć reszta to inwencja własna, + algorytm wzięty z schematu blokowego z neta

_13th_Dragon
To zmień kompilator i tyle, ewentualnie podaj przed pętlą: printf("NWD dla liczb %llu, %llu wynosi (jeżeli podawałeś ujemne to masz wadliwy kompilator): ",a,b);
MarekR22
Moderator C/C++
  • Rejestracja:około 17 lat
  • Ostatnio:minuta
0

Może taka podpowiedź: jeśli r = gcd(a,b) to ile wynosi gcd(-a, b) oraz gcd(a, -b)?


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
lion137
  • Rejestracja:około 8 lat
  • Ostatnio:2 minuty
  • Postów:4884
0

edytowany 1x, ostatnio: lion137
enedil
Po co python do tego...
lion137
Przykładowa odpwiedź, jak to robi Python
MarekR22
To było pytanie retoryczne. gcd to Największy Wspólny Podzielnik, ergo z tej definicji wynika, że wynik zawsze jest dodatni, bo jak coś jest podzielne przez r to musi być podzielne przez -r, a która z tych wartości jest większa?
KS
  • Rejestracja:prawie 4 lata
  • Ostatnio:6 dni
  • Postów:581
1

To są jakieś defajny na flagi kompilacji w VS ?
Takie rzeczy przekazuj przy wywoływaniu kompilacji/budowaniu a nie w kodzie.

Kopiuj
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE

To jest jakaś prehistoria, nie powinno Ci to być do niczego potrzebne.

Kopiuj
#include <conio.h>

A to znowu jakieś flagi VS do warnów. Tak samo jak wyżej.

Kopiuj
#include <locale.h>#pragma warning( push, 4 )

Zasadniczo moim zdaniem te linijki nie powinny znaleźć się w kodzie.
Pozdrawiam!

edytowany 1x, ostatnio: cerrato
Zobacz pozostałe 2 komentarze
_13th_Dragon
To było pytanie do @ksh, który klepie posty bezmyślnie wg mnie.
KS
@_13th_Dragon: pytanie zostało olane, było z tych głupich.
_13th_Dragon
Nie, nie jest głupie, to sugestie są głupie, bo jak jakieś konkretne źródło nie da się skompilować bez jakieś opcji to lepiej aby ta opcja była w źródle, Bo w tym przypadku jak przeniesiesz to do kompilatora oraz dojedzie kolejny plik w którym poprawnie używane nowo-twory od M$ to przeoczysz błąd.
KS
" nie da się skompilować bez jakieś opcji to lepiej aby ta opcja była w źródle" Zdecydowanie nie.
_13th_Dragon
O tak wymuszasz każdego kto grzebie w make aby pamiętał że akurat ten plik źródłowy musi mieć pewne opcje - czy ty z tych co nie używają const bo niby po kiego i tak będziesz pamiętać?
KS
  • Rejestracja:prawie 4 lata
  • Ostatnio:6 dni
  • Postów:581
1

Jeszcze jedno

Kopiuj
    (void)setlocale(LC_ALL, "pl-PL");

To raczej też jest zbędne. Nadto błąd powinno się sprawdzić. Głowy nie dam ale czy to raczej nie jest pl_PL.utf8 ??? Coś w tym stylu.
Tak na zdrowy chłopski rozum bez zaglądania. Radziłbym to sprawdzić. Jak da się to lepiej locales unikać jak ognia - taka moja dodatkowa rada.

edytowany 1x, ostatnio: cerrato
A3
  • Rejestracja:prawie 7 lat
  • Ostatnio:około 12 godzin
  • Postów:3
0
Kopiuj
 unsigned long long a = 0, b = 0;

unsigned powoduje, że do zmiennej nie można zapisać liczby ujemnej, a za to można zapisać większe liczby dodatnie. Usuń zatem 'unsigned'.

edytowany 1x, ostatnio: Agr3st
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)