Program w C

boroboroboro
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 21 mar 2010, o 10:29
Płeć: Mężczyzna
Lokalizacja: Wrocław

Program w C

Post autor: boroboroboro »

Witam mam takie zad ;
1. Przyjmij k <- 0, a następnie powtarzaj operacje: k <- k+ 1,
u <- u/2, v <- v/2 zero lub więcej razy do chwili gdy
przynajmniej jedna z liczb u i v przestanie być parzysta.

2. Jeśli u jest nieparzyste to przyjmij t <- -v i przejdź do kroku 4.
W przeciwnym razie przyjmij t <- u.

3. (W tym miejscu t jest parzyste i różne od zera). Przyjmij
t <- t/2.

4. Jeśli t jest parzyste to przejdź do 3.

5. Jeśli t > 0, to przyjmij u <- t, w przeciwnym razie przyjmij
v <- -t.

6. Przyjmij t <- u-v. Jeśli t ≠ 0 to wróć do kroku 3.
W przeciwnym razie algorytm zatrzymuje się z wynikiem u*2^k.


a kod to ;

Kod: Zaznacz cały

/*algorytm_B.c */#include <stdio.h>#include <stdlib.h>#include <math.h>int main (void){    int k, u, v, t;        printf("Program wyszuka najwiekszy wspolny dzielnik liczb u i v.

");        printf("Podaj u = ");    scanf("%d", &u);        printf("Podaj v = ");    scanf("%d", &v);        k = 0;    do    {        u /= 2;        v /= 2;        ++k;    }    while (u%2 != 0 || v%2 != 0);        if (u%2 != 0)    {        t = (-1)*v;        if (t%2 != 0)        {            do t /= 2;            while (t%2 != 0);        }        else ;    }    else    {        t = u;        do t /= 2;        while (t%2 != 0);    }        if (t>0) u = t;    else v = (-1)*t;        t = u - v;    do    {        do t /= 2;        while (t%2 != 0);                if (t>0) u = t;        else v = (-1)*t;    }    while (t == 0);    printf("GCD(u,v) = %d ", u*pow(2,k));        system("PAUSE");    return 0;} 



może ktoś to poprawić dzieki wielkie
Dakurels
Użytkownik
Użytkownik
Posty: 291
Rejestracja: 16 paź 2009, o 18:31
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 55 razy

Program w C

Post autor: Dakurels »

Nie widzę za bardzo sensu tego algorytmu ale ok.

Kod: Zaznacz cały

/*algorytm_B.c */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main (void)
{
    int k, u, v, t;
    
    printf("Program wyszuka najwiekszy wspolny dzielnik liczb u i v.

");
    
    printf("Podaj u = ");
    scanf("%d", &u);
    
    printf("Podaj v = ");
    scanf("%d", &v);
    
    k = 0;
    while (u%2 == 0 && v%2 == 0)
    {
        u /= 2;
        v /= 2;
        ++k;
    }
    if (u%2 != 0)
       t=-v;
    else
        t=(-u)/2;
    do
    {
      while (t%2==0)
            t/=2;
      if (t>0)
         u=t;
      else
          v=-t;
      t=u-v;
     }
     while (t!=0); 
    printf("GCD(u,v) = %d ", u*pow(2,k));
    
    system("PAUSE");
    return 0;
} 
Jest tu dożo mnożeń i obliczania reszty z dzielenia przez 2 ja bym się na twoim miejscu pobawił przesunięciami binarnymi byłoby szybciej.
boroboroboro
Użytkownik
Użytkownik
Posty: 3
Rejestracja: 21 mar 2010, o 10:29
Płeć: Mężczyzna
Lokalizacja: Wrocław

Program w C

Post autor: boroboroboro »

Dzięki za wskazówkę ale poradziłem sobie jakoś i o dziwo działa tym kodem który zamieściłem , zasadniczo nie był on taki zły ale miałem mały błąd ... dzieki jeszcze raz
ODPOWIEDZ