PAT 1062 乙等 (最简分数)c++ 版本

慢慢开始总结修改曾经写过的代码。
此题利用C语言的scanf() 输入函数, 方便读取固定格式的输入。
eg: xx/xx ; xx-xx; xx%xx … 之类的输入格式。


#include <iostream>
#include <stdio.h>
using namespace std;
// pat 平台测试点中要求的最简分数分子都小于分母 
//寻找最大公约数(展转相除法)
int zuiDa(int a, int b){
    while(b){
        if (b%a == 0)
            return a;
        else{
            int temp = b%a;
            b = a;
            a = temp;
        }
    }
}


int main()
{
    //a1/b1 , a2/b2 表示两个分数, c为要求输入分母
    int a1(0), a2(0), b1(0), b2(0), c(0);  
    scanf("%d/%d %d/%d %d", &a1, &b1, &a2, &b2, &c);


    for (int i = 1; i < c; i++){
        if (zuiDa(i, c) == 1){
            if (a1*b2>a2*b1){         //a1/b1 > a2/b2
                if (a1*c > i*b1 && a2*c < i*b2){

----------
// 查找下一个满足条件的分子,如果存在,则输出加空格,否则不加空格
// 解释我的解答中,这个for循环为啥不设置边界条件
// 循环中间不设边界条件 eg: 满足 31/33 -- 34/33 之间, 分母33(测试                  
//  点4)
// 当i为32时, 查找33是否满足, zuiDa(33,33)最大公约数为33,而且
//  33/33
// 满足范围要求, 因此查看分子为34的情况, 如果设边界条件 j<=c;则分子
//为32
// 的情况无法正常输出。

----------
                    for (int j = i + 1; ; j++){  
                        if (zuiDa(j, c) == 1 && a1*c > j*b1 && a2*c < j*b2){

                            cout << i << "/" << c << " ";
                            break;
                        }
                        if (a1*c <= j*b1){
                            cout << i << "/" << c;
                            break;
                        }
                    }

                }
            }

            else{  // a1/b1 < a2/b2
                if (a1*c <i*b1 && a2*c >i*b2){   
                    for (int j = i + 1; ; j++){
                        if (zuiDa(j, c) == 1 && a1*c <j*b1 && a2*c >j*b2){

                            cout << i << "/" << c << " ";
                            break;
                        }
                       if (a2*c <= j*b2){
                            cout << i << "/" << c;
                            break;
                        }
                    }
                }
            }
        }
        }


    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值