首页 > 其他分享 >PAT Basic 1062. 最简分数

PAT Basic 1062. 最简分数

时间:2023-04-02 15:16:09浏览次数:43  
标签:简分数 PAT num1 num2 int den2 1062 den3

PAT Basic 1062. 最简分数

1. 题目描述:

一个分数一般写成两个整数相除的形式:\(N/M\),其中 \(M\) 不为0。最简分数是指分子和分母没有公约数的分数表示形式。

现给定两个不相等的正分数 \(N_1/M_1\) 和 \(N_2/M_2\),要求你按从小到大的顺序列出它们之间分母为 \(K\) 的最简分数。

2. 输入格式:

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

3. 输出格式:

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

4. 输入样例:

7/18 13/20 12

5. 输出样例:

5/12 7/12

6. 性能要求:

Code Size Limit
16 KB
Time Limit
400 ms
Memory Limit
64 MB

思路:

关键在于最简分数的判断,一个分数为最简分数等价于分子分母的最大公约数为1。这里定义子函数int getGCD(int num1, int num2);使用辗转相除法求两数的最大公约数。然后根据\(N_1,N_2,M_1,M_2\)和\(K\)计算出分子的上下限,注意到题目中要求最简分数在给定两数之间,这里使用库函数ceilfloor分别计算上下限,最后遍历上下限输出结果。

第一次提交时testpoint1,2报wrong answer,检查了逻辑感觉无问题,参考大佬题解:1062. 最简分数(20)-PAT乙级真题_柳婼的博客-CSDN博客 ,发现固定思维了,给定的两个分数不一定是按照大小顺序给出,需要自己判断下。。。修改后testpoint2仍然报wrong answer。最后发现还是上下限的问题,即使用了ceilfloor还是有可能出现最简分数与给定的两个分数相等的情况,这里还需要额外判断下,确保最简分数一定在两数之间,修改后AC。

My Code:

#include <stdio.h>
#include <math.h> // floor ceil header

int getGCD(int num1, int num2);

// first submit testpoint1, 2 wrong answer
int main(void)
{
    int num1=0, den1=0; // numerator1 denominator1
    int num2=0, den2=0;
    int den3=0;
    int lowBound=0, upBound=0;
    int i=0; // iterator
    int firstBlood=0; // output space flag
    int temp=0; // to swap fractions
    
    scanf("%d/%d", &num1, &den1);
    scanf("%d/%d", &num2, &den2);
    scanf("%d", &den3);
    
    //fixed testpoint1, testpoint2 still wrong answer
    if(num1*den2 > num2*den1) // N1/M1 may > N2/M2, need to swap two fractions
    {
        temp = num1;
        num1 = num2;
        num2 = temp;
        
        temp = den1;
        den1 = den2;
        den2 = temp;
    }
    
    //printf("GCD of (1997, 615): %d\n", getGCD(1997, 615)); // test getGCD
    //printf("GCD of (2, 7): %d\n", getGCD(2, 7)); // test getGCD
    
    // num1/den1 < x/den3 < num2/den2
//     lowBound = ceil(1.0*num1*den3/den1);
//     upBound = floor(1.0*num2*den3/den2);
    lowBound = ceil((double)num1*(double)den3/(double)den1);
    upBound = floor((double)num2*(double)den3/(double)den2);
    
    // fixed testpoint2, it's about bound bug.
    if(num1 * den3 == lowBound * den1) ++lowBound;
    if(num2 * den3 == upBound * den2) --upBound;
    
    for(i=lowBound; i<=upBound; ++i)
    {
        if(getGCD(i, den3)==1) // GCD == 1 means no other divisor
        {
            if(firstBlood)
            {
                printf(" %d/%d", i, den3);
            }
            else
            {
                firstBlood = 1;
                printf("%d/%d", i, den3);
            }
        }
    }
    printf("\n");
    
    return 0;
}

int getGCD(int num1, int num2)// GCD: Greatest Common Divisor
{
    int temp =0;
    while((temp=num1%num2) != 0)
    {
        num1 = num2;
        num2 = temp;
    }
    
    return num2;
}

标签:简分数,PAT,num1,num2,int,den2,1062,den3
From: https://www.cnblogs.com/tacticKing/p/17280486.html

相关文章

  • PAT Basic 1061. 判断题
    PATBasic1061.判断题1.题目描述:判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分。2.输入格式:输入在第一行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量。第二行给出M个不超过5的正整数,是每道题的满分值。第三......
  • selenium使用css selector和xpath的比较
    selenium提供的定位方式(常用)推荐的定位方式的优先级   优先级最高:ID   优先级其次:name   优先级再次:CSSselector   优先级再次:Xpath针对cssselector和xpath的优先级做一个简单的说明在项目中我们可能用的最多的是css或者xpath,那么针对这两种,我们优先选择css,原......
  • PAT Basic 1060. 爱丁顿数
    PATBasic1060.爱丁顿数1.题目描述:英国天文学家爱丁顿很喜欢骑车。据说他为了炫耀自己的骑车功力,还定义了一个“爱丁顿数”\(E\),即满足有\(E\)天骑车超过\(E\)英里的最大整数\(E\)。据说爱丁顿自己的\(E\)等于87。现给定某人\(N\)天的骑车距离,请你算出对应的爱丁......
  • Spatial Join,空间连接
    WelearnedhowtousetheSpatialJointooltoattachinformationfromoneattributetabletoanotherbasedonthespatialrelationshipofthefeaturesinvolved.Itisaveryusefultoolthatcanhelppeopleworkefficiently.However,Iamnotveryfam......
  • 解释器模式(Interpreter Pattern)
    一、概念解释器模式(InterpreterPattern)用于构造一个简单的语言解释器,将字符串按照自定义的方式解释执行,是一种不常用的设计模式除非从事底层开发自己需要去定义较为复杂的表达式,否则基本上不同这个设计模式二、适用场景(1)当一个语言需要解释执行,并可以将该语言中的句子......
  • PAT Basic 1059. C语言竞赛
    PATBasic1059.C语言竞赛1.题目描述:C语言竞赛是浙江大学计算机学院主持的一个欢乐的竞赛。既然竞赛主旨是为了好玩,颁奖规则也就制定得很滑稽:0、冠军将赢得一份“神秘大奖”(比如很巨大的一本学生研究论文集……)。1、排名为素数的学生将赢得最好的奖品——小黄人玩偶!2、......
  • PAT Basic 1058. 选择题
    PATBasic1058.选择题1.题目描述:批改多选题是比较麻烦的事情,本题就请你写个程序帮助老师批改多选题,并且指出哪道题错的人最多。2.输入格式:输入在第一行给出两个正整数N(≤ 1000)和M(≤ 100),分别是学生人数和多选题的个数。随后M行,每行顺次给出一道题的满分值(不超过5的......
  • PAT Basic 1057. 数零壹
    PATBasic1057.数零壹1.题目描述:给定一串长度不超过 \(10^5\) 的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0、多少1。例如给定字符串 PAT(Basic),其字母序号之和为:16+1+20+2+1+19......
  • SQL Server – 执行计划和各种 join 方式 (Execution plan & Join Pattern)
    What,When,Why?什么是ExecutionPlan?Executionplan里头包含了query执行时的各做information,比如IO速度,查找了多少rows等等为什么要看ExecutionPlan?当query慢的时候,可以通过分析executionplan,知道它为什么慢,然后做优化.怎样优化?优化的方法有......
  • PAT Basic 1056. 组合数的和
    PATBasic1056.组合数的和1.题目描述:给定N个非0的个位数字,用其中任意2个数字都可以组合成1个2位的数字。要求所有可能组合出来的2位数字的和。例如给定2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。2.输入格式:输入在一行中先给出N(1 < N < ......