您的位置:首页 > 其它

分数加减法

2017-06-06 16:09 169 查看


分数加减法

时间限制:3000 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




题目分析:简单的根据分数的加减法规则进行计算即可。需要注意的有两点:①输出时候要考虑到特殊的情况。②求出的分数需要为最简式。


代码:


#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <string>
#include <algorithm>
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int gcd(int top,int bottom){
//求 top 和 bottom的最大公约数 根据程序的执行逻辑和题意可知 第一次进入时top和bottom不为0
if(top == 0 && bottom == 0) {
//都为0则不存在最大公约数
return -1;
}else if(bottom == 0){
return top;
}else return gcd(bottom,top%bottom);
}
struct Fraction{
int top;  //分子
int bottom; //分母
Fraction operator+(const Fraction &x)const{
Fraction ans;
ans.top=top*x.bottom+bottom*x.top;
ans.bottom=bottom*x.bottom;

return ans;
}
Fraction operator -(const Fraction &x)const{
Fraction ans;
ans.top=top*x.bottom-bottom*x.top;
ans.bottom=bottom*x.bottom;

return ans;
}

void reduction() {
//化简函数
if(top == 0){
return;
}
//cout<<top<<endl;
int gcdnum=gcd(top,bottom);  //求分子和分母的最大公约数
//cout<<gcdnum<<endl;
//分子分母同时除以最大公约数即得到最简式
top=top/gcdnum;
bottom=bottom/gcdnum;
}
void output(){
//输出的特殊情况 :top=0  bottom=1,-1  bottom<0
if(top == 0  || bottom == 0){  //题意说bottom不为0
cout<<"0"<<endl;
return;
}
int tmp	= top*bottom;  //由题意可知bottom不会为负
if(tmp > 0)	{
if(abs(bottom) == 1){
cout<<abs(top)<<endl;
return;
}else{
cout<<abs(top)<<"/"<<abs(bottom)<<endl;
return;
}
}else{
if(abs(bottom) == 1){
cout<<"-"<<abs(top)<<endl;
return;
}else{
cout<<"-"<<abs(top)<<"/"<<abs(bottom)<<endl;
return;
}
}
}
};
int main(int argc, char** argv) {
char input[7];
while(scanf("%s",input)!=EOF){
Fraction ans;
Fraction a,b;
a.top=input[0]-'0';
a.bottom=input[2]-'0';

char op=input[3];

b.top=input[4]-'0';
b.bottom=input[6]-'0';

if(op == '+'){
ans=a+b;
}else{
ans=a-b;
}
ans.reduction();
ans.output();
}
return 0;
}

代码分析:
本题通过求出分子分母的最大公约数来进行化简分式。
收获:感觉没啥收获。
附上所谓的优秀代码:
#include<stdio.h>
02.
char
 
str[20];
03.
int
 
Gcd(
int
 
m,
int
 
n)
04.
{
05.
if
 
(m==0) 
return
 
n;
06.
return
 
Gcd(n%m,m);
07.
}
08.
int
 
main()
09.
{
10.
int
 
fz,fm,gcd;
11.
while
(
scanf
(
"%s"
,str)!=EOF)
12.
{
13.
if
(str[3]==
'-'
)
14.
fz=(str[0]-
'0'
)*(str[6]-
'0'
)-(str[2]-
'0'
)*(str[4]-
'0'
);
15.
else
 
fz=(str[0]-
'0'
)*(str[6]-
'0'
)+(str[2]-
'0'
)*(str[4]-
'0'
);
16.
if
(fz)
17.
{
18.
fm=(str[2]-
'0'
)*(str[6]-
'0'
);
19.
gcd=Gcd(fz,fm);
20.
if
(gcd<0) gcd=-gcd;
21.
if
(fm/gcd==1) 
printf
(
"%d\n"
,fz/gcd);
22.
else
 
printf
(
"%d/%d\n"
,fz/gcd,fm/gcd);
23.
}
24.
else
 
puts
(
"0"
);
25.
}
26.
}
对比:
我的代码基本上用的是面向对象的思想,显得比较冗长。下面的代码则是直接以面向过程的方式处理,简洁一些。
另外一点是我的代码中考虑了就本题而言不会发生的情况,比如gcd函数中同时等于0对于本题而言不会发生,但抛去本题而言求两个数的最大公约数
是需要考虑的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分数加减法