这道题大慨我做了两个多小时,WA了好几次,最后才找出问题出在哪,
1:我没有考虑到分子可以整除分母,这时应该输出一个整数,而我一直输出分式,这就必错无疑了。
2:刚开始没考虑到要化简,导致错误。
3:不明白它的以EOF结尾是什么意思,事实上有两种方式,一种是c中的
char s[1000];
while(scanf(“%s”,s)!=EOF){
}
还有一种就是c++中的
string a;
while(cin>>a){
}
这样的自己会判断是不是文档末尾,很是方便。
3还有一个就是辗转相减法复习一下,总的来说,这道题还是挺不错的
int qiu(int a,int b){
if(a<0)a=-a;
while(a!=b){
if(a>b)a=a-b;
else b=b-a;
}
return a;
}
描述
编写一个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
来源
水题比赛
上传者
hzyqazasdf
#include<iostream>
#include<cstring>
using namespace std;
int qiu(int x,int y){
if(x<0)x=-x;
while(x!=y){//辗转相减法
if(x>y)x=x-y;
else y=y-x;
}
return x;
}
using namespace std;
int main(){
string a;
while(cin>>a){
int m=qiu(a[2]-'0',a[6]-'0');
m=(a[2]-'0')*(a[6]-'0')/m;
int a1,a2;
a1=m/(a[2]-'0');
a2=m/(a[6]-'0');
int fenzhi;
if(a[3]=='+')//将分子求出来
fenzhi=a1*(a[0]-'0')+a2*(a[4]-'0');
if(a[3]=='-')
fenzhi=a1*(a[0]-'0')-a2*(a[4]-'0');
if(fenzhi==0){//判断是否为0
cout<<'0'<<endl;
continue;
}
//判断是否为一个整数
if(fenzhi%m==0)cout<<fenzhi/m<<endl;
else{
int simp=qiu(fenzhi,m);
fenzhi=fenzhi/simp;
m=m/simp;
cout<<fenzhi<<'/'<<m<<endl;
}
}
return 0;
}