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