分数加减法 nyoj

                              /*编写一个C程序,实现两个分数的加减法
                                 输入
                                 输入包含多行数据
                                 每行数据是一个字符串,格式是"a/boc/d"。
                                 其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。

                                数据以EOF结束
                                输入数据保证合法
                                输出
                              对于输入数据的每一行输出两个分数的运算结果。
                               注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
                                         样例输入
                                              1/8+3/8
                                              1/4-1/2
                                              1/3-1/3

                                     样例输出
                                                1/2
                                                -1/4
                                                 0
                                 */

//因为nyoj上的测试数据不会有分母为0的,所以分母为0,无需考虑。


#include<stdio.h>
int abs(int x)
{
 return x>0?x:(-x);
}
int main()
{
 int a,b,c,d,e,f;
 int m,n,t;
 char q,o;
 while(scanf("%d/%d%c%d/%d",&a,&b,&o,&c,&d)!=EOF)//读取 数据,将其中的加号或减号存入字符o 中。
 {
      if(a==0&&c==0)//当第一个分子和第二个分子同时为0,则结果为0。
       printf("0\n");
       else if(a==0)//当输入的第一个分子等于0,不需进行运算,直接输出符号和最后一个分数即可
       { 
             if(o=='-')//因为输出结果不能含有'+',当o是'-'时才输出该符号.
               printf("%c%d/%d\n",o,c,d);
              else
              printf("%d/%d\n",c,d);
        }
  else if(c==0)//如果第二个分子为0,无需运算,直接输出第一个分数即可。
   printf("%d/%d\n",a,b);
  else//当两个分数的分子都不为0时,进行以下运算。
  {
   if(o=='+')
    e=a*d+b*c;//e用来储存通分后的分子
   if(o=='-')
    e=a*d-b*c;//e用来储存通分后的分子
   if(e==0)//如果通分后分子为0,则结果为0。
    printf("0\n");
   else
   {
    f=b*d;//f用来储存通分后的分母
    m=f;//保留数据f
    n=abs(e);
    if(m>n)///求出分子与分母的最大公约数
    {
     t=m;m=n;n=t;
    }
    while(m!=0)
    {
     if(n%m==0)
      break;
     t=n%m;
     n=m;
     m=t;
    }
    if(f==m)//如果最大公约数就是f,那么结果就是一个整数,即:e/m。
               printf("%d\n",e/m);
    else
    printf("%d/%d\n",e/m,f/m);//分子和分母同时除以最大公约数,约分
   }
  }
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值