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 ;
    }

}	
posted @ 2020-08-07 11:49  小马小马最可爱  阅读(177)  评论(0)    收藏  举报