1062 最简分数 (20分)
题目
一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
现给定两个不相等的正分数 N1/M2 和 N2/M1,要求你按从小到大的顺序列出它们之间分母为 K 的最简分数。
输入格式
输入在一行中按 N/M 的格式给出两个正分数,随后是一个正整数分母 K,其间以空格分隔。题目保证给出的所有整数都不超过 1000。
输出格式
在一行中按 N/M 的格式列出两个给定分数之间分母为 K 的所有最简分数,按从小到大的顺序,其间以 1 个空格分隔。行首尾不得有多余空格。题目保证至少有 1 个输出。
输入样例
7/18 13/20 12
输出样例
5/12 7/12
解析
输出两个分数a,b之间的,以k为分母得最简分数,我们需要从小到大输出,因此需要将小分数a放在前面,如果输入的第一个分数较大,因该交换位置for循环从1开始,直到 i/k小于较大得数b,每一个数都判断是否为最简分数,然后输出
完了以后发现直接输出不太行,不方便控制格式,于是选择先将每个合格得i保存到a数组,同时计数,最后同时输出
答案
#include<iostream>
#include<math.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int an,a[10001];
void Print(int x,int k){
for(int i = 2 ; i <= x ; i++){
if(x % i == 0 && k % i == 0){
return;
}
}
a[an++] = x;
}
int main(){
double a1,a2,b1,b2,k;
scanf("%lf/%lf %lf/%lf %lf",&a1,&a2,&b1,&b2,&k);
if(a1/a2 > b1/b2){
swap(a1,b1);
swap(a2,b2);
}
for(int i = 1 ; i/k < b1/b2 ; i++){
if(i/k > a1/a2){
Print(i,(int)k);
}
}
for(int i = 0 ; i < an ; i ++){
if(i) cout << " ";
cout << a[i] << "/" << k ;
}
}

浙公网安备 33010602011771号