分数的加减法

题目描述:实现分数的加减法运算

 


 

输入:多组样例,每行一个样例,以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 }

 运行效果如下:

 

posted @ 2021-01-26 11:01  EvanTheBoy  阅读(541)  评论(0)    收藏  举报