来让你开  

一个分数一般写成两个整数相除的形式:/,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。

现给定两个不相等的正分数 / 和 /,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。

输入格式:

输入在一行中按 / 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。

输出格式:

在一行中按 / 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。

输入样例:

7/18 13/20 12

输出样例:

5/12 7/12

这个题,刚开始做的时候感觉很简单,但是做的时候出现了一点问题,有一个测试点一直不过,然后从网上找原因,大部分是要交换给的两个数字,但是我已经注意到了一点,经过我苦苦思考至于发现了
是浮点数运算出了问题,因为我频繁的把int与double进行强制类型转换,导致一些数字的精度发生了改变,从而数值就发生了改变,所以导致我这个题写了好多遍。

#include <iostream>

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstdlib>
 6 #include <cstring>
 7 using namespace std;
 8 int yue(int a,int b)
 9 {
10     int c;
11     int flag=0;
12     c=min(a,b);
13     for(int i=2;i<=c;i++)
14     {
15         if(b%i==0 && a%i==0)
16         {
17             flag=1;
18             break;
19         }
20     }
21     return flag;
22 }
23 int main()
24 {   double n1,m1,n2,m2,k;
25     double a1,b1;
26     int count1=0;
27     scanf("%lf/%lf %lf/%lf %lf",&n1,&m1,&n2,&m2,&k);
28     a1=n1/m1;
29     b1=n2/m2;
30     if(a1>b1)
31     {   double t;
32         t=a1;
33         a1=b1;
34         b1=t;
35     }
36     for(int  i=1;i<=1000;i++)
37     {
38         if((doubl   e)i/k>=(a1+0.0000001) && (double)i/k<=(b1-0.00000001))
39         {
40             if(yue(i,k)==0 && count1==0)
41             {   count1++;
42                 printf("%d/%d",i,(int)k);
43             }
44             else if( count1!=0 &&   yue(i,k)==0)
45             {
46                 printf(" %d/%d",i,(int)k);
47             }
48         }
49     }
50 
51     return 0;
52 }

 





posted on 2018-07-06 15:40  来让你开  阅读(786)  评论(0)    收藏  举报