【问题标题】:Reach A Target number only using other two numbers仅使用其他两个号码达到目标号码
【发布时间】: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


【解决方案1】:

在下面给出的等式中

 x*R - Remain = 0modL
 where R, L and Remain are fixed.

可以写成

((x*R)mod L - Remain mod L) mod L = 0

如果 Remain mod L = 0,那么 x*R 应该是 L 的倍数,这使得 x 为 0modL。 表示 x 可以为 0,nR,其中 n 为整数。

所以,很简单,你可以尝试 0 到 L-1 之间的 x 来找到 x。

因此,您的循环可以从 0 运行到 L-1,这将使您的循环保持有限。

请注意,这个模组不同于 %. -1 mod L = L-1-1%L = -1

还有另一种方法。

x*R mod L - Remain mod L = 0 mod L

导致

x*R mod L = Remain mod L
(x* (R mod L)) mod L = (Remain mod L)

您可以在 L(如果确实存在)的字段中计算 R 的逆(例如 Rinv)并计算 x = (Remain*Rinv)modL。 如果逆不存在,则表示方程不能满足。

注意:我不是数学专家。所以,如果有任何问题,请发表您的意见。

见:https://www.cs.cmu.edu/~adamchik/21-127/lectures/congruences_print.pdf

【讨论】:

  • 计算逆使用 - 你猜对了,欧几里得算法。直接使用会更快。 =)
  • 不!它本质上是相同的方法。在 EA 以非单位 gcd 终止的情况下,逆运算失败,并且您最终会在最后进行一次额外的乘法运算。我不确定在 C++ 标准库中是否有一个方便的模块化逆实现,就像在 Java 中一样 - 所以无论如何 OP 可能都必须实现 EA。如果你想让我挑剔一些东西,我会告诉你,你计算逆的组不一定是一个字段。 =p
猜你喜欢
  • 1970-01-01
  • 2018-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2013-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多