分数化简,求大神帮忙看下我的代码问题出在哪里了。

分数化简要化简到最简形式,比如12/20可以化简成6/10和3/5,但3/5是最简形式,不要求将假分数(如7/2)化简成带分数(3)形式。先从键盘输入两个整数m和n(1<=m,n<=10000) ,其中m表示分子,n表示分母。然后输出分数化简后的最简形式。

#include <stdio.h>
#include <math.h>
int Gcd(int a, int b);
int main()
{
    int m,n;
    printf("Input m,n:");
    scanf("%d,%d",&m,&n);
    if(1<=m&&n<=10000&&n!=0)
    {
        m=m/Gcd(m,n);
        n=n/Gcd(m,n);
        printf("%d/%d\n",m,n);
    }
    else
        printf( "Input error!\n");
    return 0;
}

int Gcd(int a, int b)
{
  int i=0,max;
  if (abs(a)>abs(b))
  {
      max=abs(a);
  }
  else max=abs(b);
  for(i=max;i>0;i--)
  {
    if(abs(a)%i==0&&abs(b)%i==0)
    {
        break;
    }
  }
  return i;
}

当输入210,35的时候输出了6,35。应该输出6,1才对,输入其他的几组数字倒没有问题。

参考GPT和自己的思路:

经分析,代码中的问题出在分子(m)和分母(n)简化时的公因数并没有被正确计算,导致最终输出的分数并不是最简形式。

正确的代码应该是:

#include <stdio.h>
#include <math.h>

int Gcd(int a, int b);

int main()
{
    int m,n;
    printf("Input m,n:");
    scanf("%d,%d",&m,&n);
    if (m>=1 && n>=1 && m<=10000 && n<=10000 && n!=0)
    {
        int common_factor = Gcd(m, n);
        m /= common_factor;
        n /= common_factor;
        printf("%d/%d\n",m,n);
    }
    else
        printf("Input error!\n");
    return 0;
}

int Gcd(int a, int b)
{
    if (a == 0)
        return b;
    return Gcd(b % a, a);
}

主要改动点:

  1. 在输入的合法性判断中增加了分子分母都必须大于等于1的限制。
  2. 简化分子分母时的公因数取值方式改为直接调用最大公约数函数(Gcd),原来的方法是有误的。
  3. 最大公约数函数(Gcd)的实现方式也做了调整,改用辗转相除法求解。