0
点赞
收藏
分享

微信扫一扫

【PAT (Basic Level) Practice】——【简单数学】1062 最简分数

贵州谢高低 2022-02-13 阅读 28

文章目录

一【题目难度】

  • 乙级

二【题目编号】

  • 1062 最简分数 (20 分)

三【题目描述】

  • 一个分数一般写成两个整数相除的形式: N / M N/M N/M,其中 M M M 不为0。最简分数是指分子和分母没有公约数的分数表示形式。
  • 现给定两个不相等的正分数 N 1 ​ / M 1 N_1​ /M_1 N1/M1​ 和 N 2 ​ / M 2 N_2​ /M_2 N2/M2​ ,要求你按从小到大的顺序列出它们之间分母为 K K K 的最简分数。

四【题目示例】

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

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

  • 输入样例:
    7/18 13/20 12

  • 输出样例:
    5/12 7/12

五【解题思路】

  • 这个题思路比较正常,大致思路就是将两个分数转换为小数,将两个数之间的所有分数都遍历一遍,需要保证这个分数是介于两个数字之间,并且是最简分数(只要分子分母没有公约数就是最简分数),因为要保证分母为给定的 K K K,所以从1开始遍历到 K K K,寻找每个可能的分数,满足条件才输出。但是有几个点需要注意,如下所示:
    ①:需要将除的结果用 d o u b l e double double类型,因为一定会出现分数
    ②:要注意题目的两个输入不一定是按顺序的,需要比较一下大小,方便后面比较
    ③:要注意空格,除了第一个输出前面没有一个空格,其余输出前面都有一个空格

六【最终得分】

  • 20分

七【代码实现】

#include<stdio.h>
#include<stdbool.h>

bool HasCommonDivisor(int i,int k)
{
    for(int j = 2;j<=i;j++)
    {
        if(i % j == 0 && k % j == 0)
        {
            return true;
        }
    }
    return false;
}


int main()
{
    int n1,m1,n2,m2,k;
    scanf("%d/%d %d/%d %d",&n1,&m1,&n2,&m2,&k);
    double d1 = (double)n1 / m1;
    double d2 = (double)n2 / m2;
    bool flag = true;
    if(d1 > d2)
    {
        double temp = d2;
        d2 = d1;
        d1 = temp;
    }
    for(int i = 1;i<k;i++)
    {
        if(!HasCommonDivisor(i,k))
        {
            double d = (double)i / k;
            if(d > d1 && d < d2)
            {
                if(flag == true)
                {
                    printf("%d/%d",i,k);
                    flag = false;
                }
                else
                {
                    printf(" %d/%d",i,k);
                }
            }
        }
    }
    return 0;
}

八【提交结果】

在这里插入图片描述

举报

相关推荐

0 条评论