题目描述:
分数加减法
时间限制:
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;
}
#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);
}
{
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);
}
第一次写,不好的地方多多包涵。