1062 最简分数 (20分)
一个分数一般写成两个整数相除的形式: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
本题的注意点:
没有具体给出两个数的大小顺序
本体思路:
先将两个数的大小进行排序,然后再根据给出的两个分数的范围,进一步划分,每次进行累加的时候要注意到,判断是否是可以约,使用最大公约数进行判断。
#include<stdio.h>
#include<math.h>
int swap(int *x1,int *x2)
{
int tmp;
tmp=*x1;
*x1=*x2;
*x2=tmp;
return 0;
}
int gcd(int a, int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int x1,y1,x2,y2,x,i,num=0;
scanf("%d/%d %d/%d %d",&x1,&y1,&x2,&y2,&x);
if(x1*y2>x2*y1)
{
swap(&x1,&x2);
swap(&y1,&y2);
}
int flag=0;
while(num*y1<=x1*x)
num++;
while((num*y1>x1*x)&&(num*y2<x2*x))
{
if(gcd(num,x)==1)
{
if(flag==1)
printf(" ");
printf("%d/%d",num,x);
flag=1;
}
num++;
}
return 0;
}
补充最大公约数的代码部分:
int gcd(int a, int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
关于求最大公约数的四种算法添加链接描述