问题描述
原始问题。 给定两个有效分数 a/b
和 c/d
。每个转换都将 1
添加到 a
和 b
,然后优化 a/b
。求将 a/b
转换为 c/d
的步骤数,以便 0<a<b<100000
和 0<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
并为 a
和 b
计算两个不同的 gcd。
你可以用
修复它const auto g = gcd(a,b);
a/=g;
b/=g;