2015-05-26 65 views
0

阅读本书C Programming A Modern Approach。我有一个练习,我应该把分数降到最低。将分数降至最低

,提交给我的提示,那是我第一次可以计算GCD分子和分母,然后除以在GCD分子和分母。

这里是我的程序:

#include <stdio.h> 


int main(void) 
{ 
    int frac1; 
    int frac2; 
    int gcd; 

    int a; 
    int b; 
    int c; 

    printf("Enter a fraction: "); 
    scanf("%d/%d", &frac1, &frac2); 
    b = frac1; 
    a = frac2; 

    //Calculate GCD 
    c = a % b; 

    while(gcd > 0) 
    { 
     a = b; 
     b = c; 
     c = a % b; 

     if(c <= 0) 
     { 
      gcd = b; 
      break; 
     } 
    } 


    //Divide the numerator and denominator with the GCD 
    frac1 /= gcd; 
    frac2 /= gcd; 

    printf("In lowest terms %d/%d\n", frac1, frac2); 
    return 0; 
} 

当我给6/12作为输入,我收到以下错误信息:浮点异常

我如何计算的分子和分母的GCD分别?

回答

2

在你的代码中你永远不会初始化gcd并且循环有点奇怪。 gcd何时会突然变为零,所以会退出?我想你的意思

a = frac1; 
b = frac2; 

//Calculate GCD 
c = a % b; 

while(c > 0) 
{ 
    a = b; 
    b = c; 
    c = a % b; 
} 

gcd = b; 

所以,当你输入的6/12,它会得到c = 6,进入一个循环中,切换到6/6,获得c = 0,退出并设置gcd上述成B,这是6。

+0

@SamiKuhmonen:谢谢:) – Bryan

0
  1. 当你输入6/12然后

    c = a % b; 
    

    使得c = 0,然后

    a = b; 
    b = c; 
    c = a % b; 
    

    a % b是除以0

  2. 您必须检查scanf()做扫描两个值inst假设EAD,例如

    if (scanf("%d/%d", &frac1, &frac2) != 2) 
    { 
        fprintf(stderr, "Wrong input!\n"); 
        return -1; 
    } 
    
  3. 你永远不会用来初始化gcd所以while (gcd > 0)导致不确定的,因为你不知道的gcd循环开始前的值。