输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。
输出格式:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。
输入样例1:
2/3 -4/2
输出样例1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例2:
5/3 0/6
输出样例2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
解题思路:这道题目的难点在于繁琐的数值转换,解决方法是将分出不同的函数模块,如处理最初输入的信息,将输入的信息转化为容易进行运算处理的整型;求出最大公约数将输出为“k a/b”的形式。
一,处理输入的数据:
void func1034(char x[5],char y[5]){
char a[5], b[5];
strcpy(a, x); strcpy(b, y);
//pat basic 1034
int ax, ay, bx, by;
if (b[0] != '-'){
bx = (int)b[0] - 48;
by = (int)b[2] - 48;
}
else{
bx = -1*((int)b[1] - 48);
by = (int)b[3] - 48;
}
if (a[0] != '-'){
ax = (int)a[0] - 48;
ay = (int)a[2] - 48;
}
else{
ax = -1*((int)a[1] - 48);
ay = (int)a[3] - 48;
}
二,求出最大公约数,让输出满足题目要求的输出格式
int gys = 0;
for (int i = 1; i <= abs(fenZi)&&i <= abs(fenMu); ++i)
if (fenZi%i == 0 && fenMu%i == 0)
gys = i;
if (abs(fenZi)>abs(fenMu)&&fenMu!=0){
if (fenZi>0 && fenMu>0){
cout << fenZi / fenMu << " ";
cout << fenZi%fenMu / gys << "/" << fenMu / gys;
}
else if (fenZi < 0 || fenMu<0){
cout << "(-" << abs(fenZi) / abs(fenMu )<< " ";
cout << abs(fenZi) % abs(fenMu) / gys << "/" << abs(fenMu) / gys << ")";
}
else cout << "0";
}
else if (fenMu == 0)cout << "inf\n";
else if (fenZi == 0 && fenMu != 0)cout << "0\n";
else{
if (fenZi>0&&fenMu>0){
cout << fenZi / gys << "/" << fenMu / gys;
}
else if (fenZi < 0||fenMu<0){
cout << "(-" << abs(fenZi) / gys << "/" << abs(fenMu) / gys << ")";
}
}
cout << endl;
三,加减乘除运算
void add(int ax, int ay, int bx, int by){
int fenZi = ax*by + bx*ay;
int fenMu = ay*by;
process(fenZi, fenMu);
}
void sub(int ax,int ay,int bx,int by){
int fenZi = ax*by - bx*ay;
int fenMu = ay*by;
process(fenZi, fenMu);
}
void mult(int ax, int ay, int bx, int by){
int fenZi = ax*bx;
int fenMu = by*ay;
process(fenZi, fenMu);
}
void div(int ax, int ay, int bx, int by){
int fenZi = ax*by;
int fenMu = ay*bx;
process(fenZi, fenMu);
}
四,调用输出
cout << "+:"; add(ax, ay, bx, by);
cout << "-:"; sub(ax, ay, bx, by);
cout << "*:"; mult(ax, ay, bx, by);
cout << "\:"; div(ax, ay, bx, by);