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

来源:互联网 发布:宜家床垫 知乎 编辑:程序博客网 时间:2024/05/19 14:17

慢慢开始总结修改曾经写过的代码。
此题利用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