【全网最细PAT题解】【PAT乙】1062 最简分数

70 篇文章 0 订阅

题目链接

1062 最简分数

题目描述

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

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

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

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

输入样例:
7/18 13/20 12
输出样例:
5/12 7/12

题目大意

给你两个分数,让你输出两个分数之间有小到大分母为K的所有可能分数

解题思路

  • 首先是分数的输入用scanf可以直接跳过对/的输入从而直接存储4个整形,这点在前面的题目中也出现过多次【算法】关于分数的问题
  • 还有__gcd函数的运用,注意前面有两个 _,是用来求最大公约数的
  • 本题所有的分母判断大小我都是通过交叉相乘转化为乘法了,因为除法可能会出现小数的问题,本题没有超限问题,如果是别的题目别忘了判断乘法是否超限

题解

#include<bits/stdc++.h>
using namespace std;

int main(){
    int a,b,c,d;
    scanf("%d/%d %d/%d",&a,&b,&c,&d);       //通过scanf跳过/的读入
    int k;
    cin>>k;
    if(a*d>b*c){		//把较小的分数 放前面ran
        swap(a,c);
        swap(b,d);
    }
    int num=1;
    int e=0;
    while(a*k>=num*b)	num++;		//找到比最小值大且分母为k的第一个num
    while(a*k<num*b&&c*k>num*d){		//框定范围
        if(__gcd(num,k)==1){        //__gcd函数是用来求最大公约数的
            if(e==0)
                e=1;
            else
                cout<<" ";
            
            printf("%d/%d",num,k);
        }
        num++;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值