题目链接
题目描述
一个分数一般写成两个整数相除的形式: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++;
}
}