【发布时间】:2017-12-01 07:44:29
【问题描述】:
我正在尝试编写一个可以输入 3 个 long int 变量 a、b、c 的代码。 代码应该找到所有整数 (x,y) 以便 ax+by = c,但输入值最大为 2*10^9。我不确定如何有效地做到这一点。我的算法是 O(n^2),这对于如此大的输入来说真的很糟糕。我怎样才能做得更好?这是我的代码-
typedef long int lint;
struct point
{
lint x, y;
};
int main()
{
lint a, b, c;
vector <point> points;
cin >> c >> a >> b;
for(lint x = 0; x < c; x++)
for(lint y = 0; y < c; y++)
{
point candidate;
if(a*x + b*y == c)
{
candidate.x = x;
candidate.y = y;
points.push_back(candidate);
break;
}
}
}
【问题讨论】:
-
x和y不能为负数吗? -
你应该检查Extended Euclidean Algorithm,这是最快的算法(据我所知)解决这个丢番图方程。
-
您的代码假定
c是正数,并且仅检查x和y的非负值。在相同的约束下,消除内部循环并检测是否有任何值将是微不足道的。然后一个更简单的循环,如果有一个值,找到其他值。没有这些限制,潜在对的数量是无限的。 -
我应该在帖子中提到,a、b、c 必须是正值。
标签: c++ linear-equation