Problem L: 最简分式
Description
我们知道,5/3=1+3/5,称等号后面的式子为最简分式。也就是说,在分式中,分子一定要小于分母,而且分子、分母是互质的。请写一个程序,对于用户输入的一个合法分式,输出其约简之后的结果。
Input
输入有多行,每行是“m/n”的格式表示的一个分式,其中m和n都是int类型范围内的正整数。
输入至EOF结束。
Output
输出的行数与输入一致,且每行输出与上述输入一一对应。
如果约简后,分子部分是0,则只输出整数部分。
如果整数部分是0,则按照“j/k”的格式输出;
如果整数部分不是0,则按照“i+j/k” 的格式输出约简后的结果。
其中i、j和k分别是约简后的整数部分、分子部分和分母部分。
Sample Input
100/56
8/4
3/5
Sample Output
1+11/14
2
3/5
思路:整数部分直接相除得到,分数部分:将分子减去整数部分分母,然后进行化简,化简的方法是求出最大公约数,然后分子分母同除最大公约数(这里正好复习一下辗转相除法求最大公约数)
ans:
#include<stdio.h>
#include<stdlib.h>
int gcd(int m, int n) { /* 辗转相除法求最大公约数 */
int r;
while(1) {
r = m % n;
if(r == 0)
break;
m = n;
n = r;
}
return n;
}
int main() {
int a,b,c,d,e,g;
while(scanf("%d/%d", &a, &b)!=EOF)
{
c=a/b;//整数部分
d=a-c*b;//分子
g = gcd(d, b);
d /= g;//化简后分子
b /= g;//化简后分母
if(c==0){
printf("%d/%d\n",d,b);
}
if(d==0){
printf("%d\n",c);
}
if(c!=0&&d!=0){
printf("%d+%d/%d\n",c,d,b);
}
}
return 0;
}