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.是否为最简
首次通过代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
参考:辗转相除法求最大公约数
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