Algorytm Euklidesa i liczby ujemne

Algorytm Euklidesa i liczby ujemne
SH
  • Rejestracja:ponad 3 lata
  • Ostatnio:ponad 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:prawie 20 lat
  • Ostatnio:20 dni
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:ponad 17 lat
  • Ostatnio:28 minut
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:ponad 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:ponad 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:ponad 17 lat
  • Ostatnio:28 minut
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:ponad 8 lat
  • Ostatnio:około 5 godzin
  • Postów:4946
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:około 6 godzin
  • Postów:623
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:około 6 godzin
  • Postów:623
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:4 dni
  • 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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.