一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 N1/M1 和 N2/M2,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。
输入格式:
输入在一行中按 N/M 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。
输出格式:
在一行中按 N/M 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。
样例:">样例:">样例:">输入样例:
7/18 13/20 12
输出样例:
5/12 7/12
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
解题思路:首先要了解判断两个分数的大小的方法,a/b和c/d两个分数,如果a*d>b*c则说明a/b大于c/d; 题目要求给定两个分数之间的最简分数,且分母已经给定,所以就要找到所有的可能的分子,首先按照上面的方法找到最小的分子,再判断它是否是最简分数(辗转相除法);一直循环直到该分数大于边界。
有一个需要自己挖掘的信息点:题目没有保证n1/m1一定小于n2/m2,所以为了方便起见,若n1/m1大于n2/m2则交换两组数据,然后在(n1/m1,n2/m2)的范围内进行寻找。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int gcd(int num1,int num2) //判断两个数是否有公约数
{
for(int i=2;i<1000;i++)
{
if(num1%i==0&&num2%i==0)
return 0;
}
return 1;
}
int main()
{
int n1,m1,n2,m2,k;
scanf("%d/%d %d/%d %d",&n1,&m1,&n2,&m2,&k);
if(n1*m2>n2*m1) //如果n1/m1大于n2/m2,则交换两组数据
{
swap(n1,n2);
swap(m1,m2);
}
int num = 1;
int number[1000];
int x = 0;
while(n1*k>=m1*num) num++; //找到范围内的最小分子,注意是小于等于
while(num*m2<n2*k) //在范围内找分子,注意是小于
{
if(gcd(num,k)==1) //如果是最简分数,则把分子存入number数组
{zsz
number[x++] = num;
num++;
}
else
num++;
}
for(int i=0;i<x;i++) //控制输出格式
{
if(i!=x-1)
printf("%d/%d ",number[i],k);
else
printf("%d/%d",number[i],k);
}
}