PAT-乙级-1062 最简分数

一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。

最简分数是指分子和分母没有公约数的分数表示形式。

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

输入格式:

输入在一行中按N/M的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。

题目保证给出的所有整数都不超过 1000

输出格式:

在一行中按 / 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。

行首尾不得有多余空格。

题目保证至少有 1 个输出。

输入样例:

7/18 13/20 12

输出样例:

5/12 7/12



分析:
  计算给定两个分数的值
  在两个值之间遍历分母为k的所有可能情况
  将该数通分后判断分母是否为k
  将所有结果输出即可
  PS:
    一定要通分
    输入的两个分数要保证左大右小


 1 //c++
 2 
 3 #include<iostream>
 4 using namespace std;
 5 
 6 //将分数转换为double
 7 double func(char *s){
 8   int a=0,b=0,i=0;
 9   for(;s[i]!='/';i++)
10     a=a*10+s[i]-'0';
11   for(i++;s[i]!='\0';i++)
12     b=b*10+s[i]-'0';
13   return 1.0*a/b;  
14 }
15 
16 //计算最大公约数gcd
17 int gcd(int a,int b){
18     int m;
19     if(a<b){
20         m=a;
21         a=b;
22         b=m;
23     }
24     while(b){
25         m=a%b;
26         a=b;
27         b=m;
28     }
29     return a;
30 }
31 
32 int main(){
33   char a[10],b[10];
34   double da,db;
35   int k,g,p,q,f=0;
36   cin>>a>>b>>k;
37   da=func(a);
38   db=func(b);
39   if(da>db){
40       double t=da;
41       da=db;
42       db=t;
43     }
44   for(int i=1;i<=k*1000;i++){
45       double v=1.0*i/k;
46     if(da<v&&v<db){
47       g=gcd(i,k);
48       p=i/g;
49       q=k/g;
50       if(q==k){
51         if(f){
52           cout<<' ';
53         }
54         cout<<p<<'/'<<q;
55         f=1;
56       }
57     }
58   }
59   return 0;
60 }

 


  
posted @ 2018-12-06 22:49  T丶jl  阅读(271)  评论(0编辑  收藏  举报