1062 最简分数 (20 分)
原题
https://pintia.cn/problem-sets/994805260223102976/problems/994805268334886912
思路
也是参看的别人的代码。记录下三个要点。
1、输入的两个分数不是按大小排序,自已要判断一下
2、怎么判断分子和分母不能再约分?
这两个数之间没有公约数——即最大公约数是1。
// 辗转相除法求两个非负整数的最大公约数
int gcd(int x, int y){
return y==0?x:gcd(y,x%y);
}
3、结果是开区间,不等于N1?/M1? 和 N2?/M2
代入测试用例:1/12 11/12 12
输出:5/12 7/12
代码
#include
using namespace std;
// 辗转相除法求两个非负整数的最大公约数
int gcd(int x, int y){
return y==0?x:gcd(y,x%y);//返回最大公约数
}
int main(void){
int N1,M1,N2,M2,K;
scanf("%d/%d %d/%d %d",&N1,&M1,&N2,&M2,&K);
if(N1*M2>N2*M1){//自己确定最小最大值
swap(N1,N2);
swap(M1,M2);
}
int small=(N1*K)/M1;
int max=(N2*K)/M2;
(N2*K)%M2>0?max++:max;//开区间
bool flag=false;
for (int i =small+1; i < max; i++)//开区间
{
if(gcd(i,K)==1){ //最大公约数为1就代表分子和分母不能再约分
printf("%s%d/%d",flag?" ":"",i,K);
flag=true;
}
}
}
大佬的代码更好
#include
using namespace std;
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
int main() {
int n1, m1, n2, m2, k;
scanf("%d/%d %d/%d %d", &n1, &m1, &n2, &m2, &k);
if(n1 * m2 > n2 * m1) {
swap(n1, n2);
swap(m1, m2);
}
int num = 1;
bool flag = false;
while(n1 * k >= m1 * num) num++;
while(n1 * k < m1 * num && m2 * num < n2 * k) {
if(gcd(num, k) == 1) {
printf("%s%d/%d", flag == true ? " " : "", num, k);
flag = true;
}
num++;
}
return 0;
}