1062 最简分数 (20分)

1062 最简分数 (20分)
 

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

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

输入格式:

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

输出格式:

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

输入样例:

7/18 13/20 12
 

输出样例:

5/12 7/12





代码讲解:这题很有意思,开始读题的时候我就发现了,他没说两人分数
谁打谁小,只说了不相等,第二个问题说在之间,没说包没包括,后来测试
发现是不包括的。。
他说了是真分数,就是说分子是小于分母的,这样我们就从1开始然后一直到
k-1判断这个数是不是大于俩个分数当中小的,小于俩个分数当中大的。。
就可以ac了




#include<stdio.h>                                   
int gcd(int n,int m)                                 //求最大公约数
{
if(m==0) return n;
else
return gcd(m,n%m);

}
int compare(int fenz_a,int fenm_a,int fenz_b,int fenm_b)   //比较俩个分数谁大谁小
{
int gongbei;
gongbei=fenm_b*fenm_a/gcd(fenm_b,fenm_a);
fenz_a=gongbei/fenm_a*fenz_a;
fenz_b=gongbei/fenm_b*fenz_b;
return fenz_a-fenz_b;

}
int main()
{
int fenz_a,fenm_a;
int fenz_b,fenm_b;
int k,temp;
scanf("%d/%d %d/%d %d",&fenz_a,&fenm_a,&fenz_b,&fenm_b,&k);
if(compare(fenz_a,fenm_a,fenz_b,fenm_b)>0)     //先把俩个分数大小固定好
{
temp=fenz_b;
fenz_b=fenz_a;
fenz_a=temp;
temp=fenm_b;
fenm_b=fenm_a;
fenm_a=temp;
}
int i;
int a[1000];
int count=0;
for(i=1;i<k;i++)                           //遍历一切可能的分数。。。
{
temp=gcd(i,k);
if(temp==1&&compare(i,k,fenz_a,fenm_a)>0&&compare(i,k,fenz_b,fenm_b)<0)
{
a[count++]=i/temp;
}

}
for(i=0;i<count;i++)      //输出
{
if(i==0)
printf("%d/%d",a[i],k);
else
printf(" %d/%d",a[i],k);
}
printf("\n");
return 0;
}



posted @ 2020-11-10 23:56  罪梦者  阅读(166)  评论(0)    收藏  举报