PAT Basic 1061 最简分数
一个分数一般写成两个整数相除的形式: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
题解:
- 要注意的是"两个数之间" 是包括了(a,b)之间的全部实数的,分子和分母并不必须是整数,例如输入: 1/5 4/5 2 ,答案应该是1/2, 是由 2.5/5 得来的。
- 此外题目并没有说输入的两个分数必须是前小后大,有一个测试点给的两个分数是前大后小的,所以要加一个判断。
- double类型的两个变量的大小比较,由于精度问题,最好使用相减后与一个非常小的数比较,而不是直接用大于小于和等于号
#include <stdio.h>
#include <stdlib.h>
int GCD(int x, int y) // 求最大公约数
{
return y==0? x:GCD(y,x%y);
}
int main(){
int N1,M1,N2,M2,K;
scanf("%d/%d %d/%d %d",&N1,&M1,&N2,&M2,&K);
double from = (double)N1*K/M1; // 分子是实数,要用double保存
double to = (double)N2*K/M2;
if(from - to > 1e-8){
double temp = from;
from = to;
to = temp;
}
int count=0;
for(int i=from+1;i<to;i++){
if(GCD(i,K) == 1){ // 最大公约数为1,分子与给定的分母K互质
printf("%s%d/%d",count==0?"":" ",i,K);
count++;
}
}
return 0;
}