分数的加减法
题目描述:实现分数的加减法运算
输入:多组样例,每行一个样例,以a/b-c/d或者a/b+c/d形式输入,其中a,b,c,d都是小于10000的正整数。
输出:对于每一个输入的样例,输出一个结果。注意对结果的化简。如果是整数就直接输出,不需要以分数形式输出。如果是真分数就直接以e/f的形式输出,如果是假分数就以1+2/3的形式输出,如果是-5/3,则以-2+1/3的形式输出。
样例输入:
1/1-2/3
1/2+2/3
1/2-8/2
样例输出:
1/3
1+1/6
-4+1/2
对于这道题,我们可以采取这样的思路:首先声明num1,num2,num3三个变量,分别表示加法运算的分子、减法运算的分子和分母。然后,输入的时候,不管输入的是什么,在scanf函数里都用%c来代替。这样我们之后就只需要判断是加号还是减号就可以了。此外,还需要定义一个化简分数的函数,这个函数只需要实现取两个数的最大公约数的功能即可。此外还需要注意各种分类条件、逻辑的清晰。最后记得这里要包含一个<math.h>的头文件。
代码实现如下(C语言):
1 #include <stdio.h>
2 #include <math.h>
3 int num1,num2,num3;
4 int k,num4,num5,t;
5 char ch;
6 int a,b,c,d;
7 int main(void)
8 {
9 int reduce(int x,int y);
10 while(scanf("%d/%d%c%d/%d",&a,&b,&ch,&c,&d) != EOF)
11 {
12 num1 = a*d + b*c; //加法的分子
13 num2 = a*d - b*c; //减法的分子
14 num3 = b*d; //分母
15 if(ch == '+') //分数的加法
16 {
17 if(num1>num3 && num1%num3!=0)
18 {
19 k = num1/num3; //假分数的整数部分
20 num4 = num1%num3; //新的分子
21 t = reduce(num4,num3);
22 printf("%d+%d/%d\n",k,num4/t,num3/t);
23 }
24 else if(num1 < num3 && num1 > 0) //真分数
25 {
26 t = reduce(num1,num3);
27 printf("%d/%d\n",num1/t,num3/t);
28 }
29 else if(num1%num3==0) //可化为整数
30 {
31 printf("%d\n",num1/num3);
32 }
33 }
34
35 else if(ch == '-') //分数的减法
36 {
37 if(num2>num3 && num2%num3!=0) //正假分数
38 {
39 k = num2/num3; //假分数的整数部分
40 num4 = num2%num3; //新的分子
41 t = reduce(num4,num3);
42 printf("%d+%d/%d\n",k,num4/t,num3/t);
43 }
44 else if(num2<num3 && num2>0) //正真分数
45 {
46 t = reduce(num2,num3);
47 printf("%d/%d\n",num2/t,num3/t);
48 }
49 else if(num2<0 && abs(num2)<num3) //负真分数
50 {
51 t = reduce(abs(num2),num3);
52 printf("%d/%d\n",num2/t,num3/t);
53 }
54 else if(num2<0 && abs(num2)>num3 && abs(num2)%num3!=0) //负假分数
55 {
56 k = -(abs(num2)/num3 + 1); //整数部分
57 num4 = abs(k) * num3 - abs(num2); //新的分子
58 t = reduce(num4,num3);
59 printf("%d+%d/%d\n",k,num4/t,num3/t);
60 }
61 else if((abs(num2)%num3)==0)
62 {
63 printf("%d\n",num2/num3);
64 }
65 }
66 }
67 return 0;
68 }
69
70 int reduce(int x,int y)
71 {
72 int mid = x,i;
73 if(mid > y)
74 {
75 mid = y; //让mid取x,y里面的最小值
76 }
77 for(i = mid;i >= 1;i--)
78 {
79 if(x%i==0 && y%i==0) //取出最大的可以同时被x,y整除的数,即x,y的最大公因数
80 {
81 return i; //返回这个数
82 break; //同时跳出循环
83 }
84 }
85 }
运行效果如下:


浙公网安备 33010602011771号