2015-03-29 7 views
2

Я написал этот код, чтобы получить gcd в c. Он отлично работает при малых числах , но когда я попробовал 60 и 90, например, я получил 2, при получении 3 для 9 & 6.GCD логическая ошибка

#include "stdio.h" 
#include "stdlib.h" 
int main() 
{ 
    int a,b,x,gcd; 
    printf("Please Enter the fraction"); 
    scanf("%d", &a); 
    scanf("%d", &b); 
    if(b%a == 0) 
     gcd =a; 
    else 
    { 
     x=a; 
     while(--x>1) 
     { 
      if (a%x == 0 && b%x==0) 
      { 
       gcd =x; 
      } 
     } 
    } 
    printf("GCD = %d", gcd); 
    return 0; 
} 
+0

Как обычно, лучшие улучшения исходят от выбора лучшего алгоритма. В этом случае вы должны использовать алгоритм Евклидов для GCD: http://en.wikipedia.org/wiki/Euclidean_algorithm – DrKoch

ответ

1
#include "stdio.h" 
#include "stdlib.h" 
int main() 
{ 
    int a,b,x,gcd; 
    printf("Please Enter the fraction"); 
    scanf("%d", &a); 
    scanf("%d", &b); 
    if(b%a == 0) 
     gcd =a; 
    else 
    { 
     x=a; 
     while(--x>1) 
     { 
      if (a%x == 0 && b%x==0){ 
       gcd =x; 
       break; 
      } 
     } 
    } 
    printf("GCD = %d", gcd); 
    return 0; 
} 

Проблема в том, что когда вы находите gcd, вы должны разбить цикл // В противном случае вы можете использовать эту рекурсивную функцию

int gcd(int a, int b) { 
    if (a == 0) { 
     return b; 
    } else { 
     return gcd(b%a, a); 
    } 
} 
+3

Ответ только с кодом и без описания о том, что было ошибкой в ​​исходном коде и нет описания об изменениях вы сделали не очень хорошо. –

+0

Спасибо за информацию, я просто волновался за то, чтобы быть первым в решении вопроса. – xsami

+3

Быть первым, кто решил, не слишком важен. Если вы опубликуете хороший и подробный ответ, это будет более полезно, чем только торопливо сделанный код, ответ на который может оставить ПУ путаным в том, что он сделал не так, и какие изменения были внесены в него –

4

Вы должны разорвать петлю, если условие во втором if верно , Просто добавьте break; в теле второго if:

if (a%x == 0 && b%x==0) 
    gcd =x; 

должен быть

if (a%x == 0 && b%x==0) 
{ 
    gcd =x; 
    break; 
} 

В противном случае цикл продолжается и находит наименьший общий делитель больше 1.