题目描述
将给定的分数变为以K为分母的形式,从小到大输出。
题目分析
这里有一个失分点,就是我们一开始不能保证输入的第一个分数一定大于第二个分数,所以如果第一个分数小于第二个分数,我们将二者交换。
然后i从1遍历到k,如果中间有n1/m1 > i / k且n2 / m2 < i / k且i/k是最简分数,则我们可以将i/k输出。按照这种规则,找出两个即可。(也可以选择刚开始就从小到大将输入排序。)
判断最简分数是使用gcd函数,求最大公约数。(辗转相除法)
代码
#include<stdio.h>
int gcd(int a,int b)//求最大公约数
{
if(b == 0)
return a;
return gcd(b,a%b);
}
int main()
{
int n1,m1,n2,m2,k;
scanf("%d/%d %d/%d %d",&n1,&m1,&n2,&m2,&k);
int i,j,flag1=0,t;
if(n1*m2<n2*m1) //判断一开始输入的两个分数的大小;
{
t=n1;n1=n2;n2=t;
t=m1;m1=m2;m2=t;
}
for(i=1;i<=k;i++)
{
if((n1*k>i*m1)&&(n2*k<i*m2)&&(gcd(k,i)==1))
{
flag1++;
if(flag1==1)
printf("%d/%d",i,k);
else
printf(" %d/%d",i,k);
}
}
return 0;
}
答题用时12min
Q62——finish√