将分数降低到最低值

时间:2015-05-26 12:59:19

标签: c

我正在读“C编程现代方法”一书。我有一个练习,我应该将分数降低到最低形式。

作者给我的提示,是我首先可以计算分子和分母的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 个答案:

答案 0 :(得分:4)

在您的代码中,您永远不会初始化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。

答案 1 :(得分:0)

  1. 输入6/12

    c = a % b;
    

    生成c = 0,然后

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

    a % b除以0。

  2. 您必须检查scanf()是否扫描了两个值而不是假设,示例

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

相关问题