zoukankan      html  css  js  c++  java
  • PAT 乙级1062最简分数

    1062. 最简分数(20)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard
    作者
    CHEN, Yue

    一个分数一般写成两个整数相除的形式: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
    
    思路:题目比较简单,注释应该能看懂了吧。。。

    代码:

    #include <iostream>
    #include<cmath>
    #include<algorithm>
    #include<cstdio>
    #include<string.h>
    #include<cstring>
    using namespace std;
    int gcd(int a,int b){//求最大公约数
        int yu;
        int t;
        if(a<b) {
            t=a;a=b;b=t;
        }
        yu=a%b;
        while(yu){
            a/=b;a=b;b=yu;
            yu=a%b;
        }
        return b;
    }
     /*int lcm(int a,int c){
            return a*c/gcd(a,c);
       }*/
            //给定的两个分数并没有说明哪个大,应先判断。
    int main(){
        int a,b,c,d,k;
        int i,j=0;
        int s[1005];
        scanf("%d/%d %d/%d %d",&a,&b,&c,&d,&k);
        int x=gcd(a,b);
        a/=x;b/=x;
        int y=gcd(c,d);
            c/=y;d/=y;
            for(i=1;i<=k;i++){
                double n=a*1.0/b,m=c*1.0/d;
                double t;
                if(n>m){
                    t=n;n=m;m=t;
                }
                if((i*1.0/k)>n&&(i*1.0/k)<m){
                    int z=gcd(i,k);
                    if(z==1)
                        s[j++]=i;
                }
                /*if(a*d>b*c){ //先比较两个分数的大小 
                    int t=a;
                    a=c;c=t;
                    int tmp=b;
                    b=d;d=tmp;
                  }
                  if(i*b>a*k&&i*d<c*k){//另一种比较分数大小的方法 (交叉相乘法)
                      int z=gcd(i,k);
                      if(z==1)
                          s[j++]=i;
                }*/
            }
            printf("%d/%d",s[0],k);
            for(i=1;i<j;i++){
                printf(" %d/%d",s[i],k);
            }
            printf("
    ");
            return 0;
    }

  • 相关阅读:
    JS站点
    1011 World Cup Betting (20分)
    1007 Maximum Subsequence Sum (25分)(动态规划DP)
    1006 Sign In and Sign Out (25分)
    1005 Spell It Right (20分)
    1004 Counting Leaves (30分)(DFS)
    1003 Emergency (25分)(Dijkstra算法)
    1002 A+B for Polynomials (25分)
    1001 A+B Format (20分)
    canvas
  • 原文地址:https://www.cnblogs.com/kzbin/p/9205293.html
Copyright © 2011-2022 走看看