【发布时间】:2015-01-07 05:54:10
【问题描述】:
我有两个数字 L 和 R,L 表示左,R 表示右。 我必须使用 L 和 R 达到某个数字(F)。 每次我都必须从零开始。
示例: 长:1 R : 2 F : 3
所以到达 F 所需的最少步数是 3。 Ans : 第一个 R,第二个 R,第三个 L。
在这种情况下,我需要找到最少的方法。
My approach:
Quo = F/R;
Remain : F%R;
x*R-Y*L = Remain
==> (x*R - Remain)/L = Y
this equation is break when (x*R - Remain)%L = 0, so we find x and y from the equation above.
So final Steps would be Quo + x(No. of right steps) + y( no. of left steps).
For Above Example :
Quo = 3/2 = 1;
Remain = 3%2 =1;
Y = (x*2 -1)/1
(x*2 -1)%1 is zero for x=1;
Now increase x from zero,
So x is 1, y is 1
Final Ans = Quo (1) + x (1) + y(1) = 3.
我的代码:
#include <iostream>
using namespace std;
int main()
{
int F,R,L;
cin >> F;
cin >> R;
cin >> L;
int remain = F%R;
int quo = F/R;
int Right = 0;
int left = 0;
int mode = 1;
while( mode !=0)
{
Right++;
mode = (R*Right - remain)%L;
left = (R*Right - remain)/L;
}
int final = quo + Right + left;
cout << final;
}
但我认为这不是好方法,因为我将 x 置于循环中,这可能会非常昂贵
你能建议我做这个问题的好方法吗?
【问题讨论】:
-
Stack Overflow 用于编程问题。你的程序在哪里?
-
这个问题似乎跑题了,因为它是关于逻辑和数学的。
-
不,这是一个关于算法的非常好的问题。这是一个编程问题。 OP - 您在确定问题的大小时是正确的,因为需要计算 x 和 y 的线性组合(ax + by,其中 a 和 b 是未知的)。如果您的“步骤”是加法,您将希望找到 a 和 b 的唯一(如果存在!)值,它们都是正数,并且 (a+b) 是最小值。对于较大的 x,这可以使用欧几里得算法更快地解决。阅读:en.wikipedia.org/wiki/Euclidean_algorithm - 4.6 与此问题的关系。
-
@JonathanPotter 我已经添加了我的代码。如果您为上述问题找到一些好的算法,请提出建议。 carey 可能是题外话,但应该有一个算法。
-
(不过,这听起来像是对 C++ 课程的介绍,而不是算法课程,所以除非您了解 EA,否则这可能是严格意义上的“额外功劳”)
标签: c++ algorithm math data-structures