本题有以下几点需要注意
1.为了化简分子分母,需要用到最大公约数,即gcd函数,采用欧几里得算法编写gcd函数,即两个数的最大公约数为较小数与大数模小数的余数的最大公约数,由此构成递归结构。
证明:gcd(a,b)=gcd(b,a%b) (假设a>b)
a=p*b+q (q<b)
且
故gcd(a,b)为q与b的公约数
若gcd(b,q)>gcd(a,b)
则gcd(a,b)=gcd(b,q)矛盾
故gcd(b,q)=gcd(a,b)
证毕
2.输入为字符,ASCII-48后才为具体数值(‘1’ASCII为49)
3.结果为1,0为特殊情况,需要单独讨论
#include <iostream>
#include <cstdio>
using namespace std;
int gcd(int a,int b)
{
if(a>b){
if(a%b==0) return b;
else gcd(b,a%b);
}
else if(b>a){
if(b%a==0) return a;
else gcd(a,b%a);
}
else if(a==b){
return a;
}
}
int main()
{
int a,b,c,d;
int i=0,fz,fm;
char p[7];
while(1){
cin>>p[i];
i++;
if(i==7)break;
}
a=p[0]-48;
b=p[2]-48;
c=p[4]-48;
d=p[6]-48;
if(p[3]=='+'){
if(a*d+b*c==0)cout<<0;
else{
fm=(b*d)/gcd(a*d+b*c,b*d);
fz=(a*d+b*c)/gcd(a*d+b*c,b*d);
if(fz==fm)cout<<1;
else cout<<fz<<'/'<<fm;
}
}
else if(p[3]=='-'){
if((a*d-b*c)==0)cout<<0;
else{
fm=(b*d)/gcd(a*d-b*c,b*d);
fz=(a*d-b*c)/gcd(a*d-b*c,b*d);
if(fz==fm)cout<<1;
else cout<<fz<<'/'<<fm;
}
}
return 0;
}