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
作者: CHEN, Yue
单位: 浙江大学
时间限制: 400 ms
内存限制: 64 MB
代码长度限制: 16 KB
这题是1061-1065我觉得最难的一道,说不上很难,但是坑不少,一开始只得了12分,思路也是很乱,但是大致方向找到了,就是一个个遍历判断满足条就可以。
1.有个小坑就是输入2个分数不一定升序,要注意判断。
2.解题思路一定要清晰,我是找2个分母与k的最小公倍数,然后确定2个分数变化后分子的范围,然后一个个遍历找就可以。我感觉这题是模拟,其实这样的题就是简单模拟你怎么具体做的,也就是思路,然后在用计算机算出来,所以思路一定要清晰,超时或者别的先不管,一定要先把大致的做出来,对于我来说是这样的,像什么时间复杂度或者进一步优化代码以后再做,目前还上升不了那个高度。
3.还掌握了最简分数就只要分子分母的最大公约数是1就可以了,gcd,gcm的模板代码还要熟记

#include
#include
using namespace std;
int gcd(int a,int b){//最大公约数
return b==0 ? a:gcd(b,a%b);
}
int gcm(int a,int b){//最小公倍数 两数相乘/最大公约数
 int temp=gcd(a,b);
 int t=a*b/temp;
 return t;
}
int main(){
    int q[1005],j=0,a,b,c,d,e;
    scanf("%d/%d %d/%d %d",&a,&b,&c,&d,&e);
    int t=gcm(b,d);
    int t1=gcm(t,e);//找出分母与e的最小公倍数
    int first=a*t1/b,end1=c*t1/d;//从小到大遍历
    if(first>end1){//注意,题目给的2个数不一定左小右大
        swap(first,end1);
    }
    int g=t1/e;
    for(int i=first+1;i

你可能感兴趣的:(pat乙级)