PAT乙级1062-----最简分数 (20分)

1062 最简分数 (20分)

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

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

输入格式:

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

输出格式:

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

输入样例:

7/18 13/20 12
 

输出样例:

5/12 7/12

思路:
暴力法——将分子[1,k]之间的每一个进行判断1.是否在区间内2.是否为最简

首次通过代码:
PAT乙级1062-----最简分数 (20分)
 1 #include<stdio.h>
 2 int gcd(int a,int b){
 3        int i=a%b;
 4        while(i!=0){
 5            a=b;
 6            b=i;
 7            i=a%b;
 8        }
 9        return b>0?b:1;
10 }
11 int main(){
12     int a1,b1,a2,b2,k;
13     scanf("%d/%d %d/%d %d",&a1,&b1,&a2,&b2,&k);
14     int max_a,max_b,min_a,min_b;
15     if(a1*b2>a2*b1)  {
16         max_a=a1;max_b=b1;
17         min_a=a2;min_b=b2;
18     }
19     else {
20         max_a=a2;max_b=b2;
21         min_a=a1;min_b=b1;
22     }
23     int sum=0;
24     for(int i=1;i<k;i++){
25         if(i*min_b-k*min_a>0&&i*max_b-k*max_a<0&&gcd(k,i)==1) {
26             sum++;
27             if(sum==1) printf("%d/%d",i,k);
28             else printf(" %d/%d",i,k);
29         }
30     }
31     return 0;
32 }
View Code

 

参考:辗转相除法求最大公约数
FROM:https://baike.baidu.com/item/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95/1647675?fromtitle=%E8%BE%97%E8%BD%AC%E7%9B%B8%E9%99%A4%E6%B3%95&fromid=4625352&fr=aladdin
 
上一篇:深拷贝和浅拷贝的区别


下一篇:java小程序(三)