nyoj 111分数加减法(附加四则运算)

题目描述:

分数加减法

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 2
描述
编写一个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

解题思路:
1.分数的表示:我们知道分数是由分子和分母组成,因此可以用一个结构体来保存分数,如下:
struct FenShu{
int up;//分子
int down;//分母
};

AC代码:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct FenShu{
 int up;//分子
 int down;//分母
};
int gcd(int x,int y)//求x,y的最大公约数,用于分子分母的化简
{
 if(y==0)//递归的出口
 return x;
 return gcd(y,x%y);
 }
FenShu HuaJian(FenShu result)//对分数进行化简
{
 if(result.down<0)//如果分母<0,将分子分母+-号互换
 {
  result.up=-result.up;
  result.down=-result.down;
 }
 if(result.up==0)//如果分子为0,令分母为1
 {
  result.down=1;
 }
 else
 {
  int d=gcd(abs(result.up),abs(result.down));//求分子分母的最大公约数
  result.up/=d;
  result.down/=d;
 }
 return result;//返回值为分数
}
FenShu add(FenShu f1,FenShu f2)//两个分数f1,f2相加
{
 FenShu result;//存放相加后的分数
 result.up=f1.up*f2.down+f2.up*f1.down;
 result.down=f1.down*f2.down;
 return HuaJian(result);//返回相加后的分数并化简
}
FenShu minu(FenShu f1,FenShu f2)//两个分数相减
{
 FenShu result;
 result.up=f1.up*f2.down-f2.up*f1.down;
 result.down=f1.down*f2.down;
 return HuaJian(result);
}
void print(FenShu result)//输出分数的函数
{
 result=HuaJian(result);//调用函数对分数进行化简
 if(result.down==1)//如果分母是一,直接输出分子
 {
  printf("%d\n",result.up);
 }
 else
 {
  printf("%d/%d\n",result.up,result.down);//将分数按格式输出
 }
}
int main()
{
 char a,b,c;
 FenShu f1,f2,r;
 while(scanf("%d%c%d%c%d%c%d",&f1.up,&a,&f1.down,&b,&f2.up,&c,&f2.down)!=EOF) //输入数据
 {
  if(b=='+')
  {
   r=add(f1,f2);//调用函数
  }
  if(b=='-')
  {
   r=minu(f1,f2);
  }
  print(r); //输出分数
  }
  return 0;
 }
分数乘除的函数如下:

FenShu multi(FenShu f1,FenShu f2)//乘法
{
 FenShu result;
 result.up=f1.up*f2.up;
 result.down=f1.down*f2.down;
 return HuaJian(result);
}
FenShu divide(FenShu f1,FenShu f2) //除法
{
 FenShu result;
 result.up=f1.up*f2.down;
 result.down=f1.down*f2.up;
 return HuaJian(result);
}
第一次写,不好的地方多多包涵。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值