求将 a/b 转换为 c/d 的步骤数,以便 0<a<b<100000 和 0<c<d<100000,如果没有办法,则没有

问题描述

原始问题。 给定两个有效分数 a/bc/d。每个转换都将 1 添加ab,然后优化 a/b。求将 a/b 转换为 c/d 的步骤数,以便 0<a<b<1000000<c<d<100000,如果没有办法,则没有。

#include <iostream>
#include <math.h>
using namespace std;
int gcd(int x,int y) {
    while(y) {
        int r=x%y;
        x=y;
        y=r;
    }
    return x;
}
int main() {
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    int i=0;
    while (b<d) {
        if (a*d<b*c) {
            a++;
            b++;
            a/=gcd(a,b);
            b/=gcd(a,b);
            i++;
        }
        else if (a*d==b*c) {
            cout<<i;
            break;
        }
        else {
            cout<<0;
            break;
        }
    }
}

出现错误,即输入

1
6
2
3

答案是5,但不是这里的输出..我需要帮助,感谢您的所有好评!

解决方法

第一个问题是while (b<d)。在您的示例中,6<3 是错误的,因此完全跳过了 while 循环。

接下来的问题是

a/=gcd(a,b);
b/=gcd(a,b);

您正在更改 a 并为 ab 计算两个不同的 gcd。

你可以用

修复它
const auto g = gcd(a,b);
a/=g;
b/=g;