题目描述
编写一个程序,实现两个分数的加减法
输入
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+“或者”-",(b!=0,d!=0)。
输出
对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
样例输入 Copy
1/8+3/8
1/4-1/2
1/3-1/3
样例输出 Copy
1/2
-1/4
0加粗样式
#include<bits/stdc++.h>
int main()
{
int gcd1(int a,int b);
int gcd2(int a,int b);
char s[10];
while(scanf("%s",s)!=EOF)
{
int a,b,c,d,A,B;
a=s[0]-'0';
b=s[2]-'0';
c=s[4]-'0';
d=s[6]-'0';
if(b==d)
{
B=b;
if(s[3]=='-')
A=a-c;
if(s[3]=='+')
A=a+c;
}
else
{
B=gcd1(b,d);
if(s[3]=='-')
A=B/b*a-B/d*c;
if(s[3]=='+')
A=B/b*a+B/d*c;
}
//分子、分母都已赋初值;之后开始化简。
if(A==B)
printf("1\n");
else
if(A>B)//不论A,B值为正负都不影响;B一定大于0
{
if(A%B==0)
{
printf("%d\n",A/B);
}
else
{
if(gcd2(A,B)==1)
printf("%d/%d\n",A,B);
else
{
int m=gcd2(A,B);
A=A/m;
B=B/m;
printf("%d/%d\n",A,B);
}
}
}
else//A<B,这很容易出错 A值可能为0可能为正数也可能为负数 B一定大于0
{
if(fabs(A)==1)
printf("%d/%d\n",A,B);
else
if(A==0)
printf("0\n");
else
if(B==1)
printf("%d\n",A);
else
{
if(B%A==0)
{
B=B/fabs(A);
A=A/fabs(A);
printf("%d/%d\n",A,B);
}
else//B%A!=0
{
if(fabs(gcd2(A,B))==1)
printf("%d/%d\n",A,B);
else
{
int n=gcd2(A,B);
A=A/fabs(n);
B=B/fabs(n);
if(B!=1)
printf("%d/%d\n",A,B);
else
printf("%d\n",A);
}
}
}
}
}
return 0;
}
int gcd1(int a,int b)
{
int c;
int A=a,B=b;
if(a>b)
{
while(b!=0)
{
c=a%b;
a=b;
b=c;
}
return A*B/a;
}
else
{
while(a!=0)
{
c=b%a;
b=a;
a=c;
}
return A*B/b;
}
}
int gcd2(int a,int b)
{
int c;
int A=a,B=b;
if(a>b)
{
while(b!=0)
{
c=a%b;
a=b;
b=c;
}
return a;
}
else
{
while(a!=0)
{
c=b%a;
b=a;
a=c;
}
return b;
}
}