nyoj111分数加减法

这道题大慨我做了两个多小时,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;
}

猜你喜欢

转载自blog.csdn.net/weixin_39587440/article/details/78157464