Algorytm Euklidesa i liczby ujemne

0

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

#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)
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.

2

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

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 ?

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

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

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

0

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

1

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

#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.

#include <conio.h>

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

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

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

1

Jeszcze jedno

    (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.

0
 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'.

1 użytkowników online, w tym zalogowanych: 0, gości: 1