[英]Algorithm for adding two numbers to reach a value
我有一项家庭作业,要求我检查任意三个数字,a,b,c是否等于0 <= a,b,c <= 10 ^ 16,如果我可以通过将a和b加到每个来达到c其他。 诀窍是,每增加一个值,它们的值都会变化,因此,如果将a加到b,则将得到数字a和a + b,而不是a和b。 因此,我意识到这不是一个简单的线性方程。
为了使之成为可能,目标号码c必须能够以以下形式表示:
c = x a + y b
通过一些测试,我发现x和y的值不能相等,也不能都是偶数,以使我能够达到c数。 请记住这一点,以及一些涉及a,b或c等于零的特殊情况。
有任何想法吗?
编辑:这不是欧几里得的算法,它不是双色子方程,也许我用c = x a + y c的陈述误导了您。 即使他们应该满足此声明,但这对于手头的任务还是不够的。
以a = 2,b = 3,c = 10为例。 为了达到c,您需要在第一步中将a添加到b或b中,然后在第二步中将得到:a = 2,b = 5或a = 5,b = 3 ,如果继续这样做,您将永远无法达到c。 Euclid的算法将提供yes的输出,但是很显然,通过将2和3彼此相加不能达到10。
注意:据我所知,要重述该问题:假设为您提供了非负整数a,b和c。 通过执行零次或多次运算a = a + b
或b = b + a
的序列,是否有可能达到a + b == c
?
好的,在进一步研究之后,我认为您可以对问题中的陈述做些小的改动:
为了使之成为可能,目标号码c必须能够以以下形式表示:
a + b c = a + b
其中GCD( x , y )= 1。
(此外, x和y必须为非负数;我不确定它们是否可以为0。)
您最初的观察表明,新条件GCD( x , y )= 1暗示x可能不等于y (除非它们都为1)并且x和y都不能为偶数。 因此这些观察是正确的,但不够充分。
如果在程序中使用它而不是已有的测试,则可能会使测试通过。 (我不保证任何事情。)对于更快的算法,您可以按照注释(和亨利的答案)中的建议使用扩展Euclid算法来找到一个x 0和y 0 ; b, y = y 0 - a, for some n (which may be negative). 但是,如果GCD( x 0 , y 0 )≠1,您将不得不尝试其他可能性x = x 0 + b, y = y 0 - a,对于某些n (可能为负)。
我没有严格的证明。 假设我们构造了所有对( x , y )的集合S ,使得(1,1)在S中 ,并且如果( x , y )在S中,则( x , x + y )和( x + y , y )在S中 。 显然,对于所有n > 1,(1, n )和( n ,1)都在S中。然后我们可以尝试找出对于m > n > 1的那对( m , n )如何进入S ? 如果m < n ,则仅当( m , n - m )已经在S中时才可行。 如果m > n ,则只有( m - n , n )已经在S中才有可能。 无论哪种方式,当您不断从较大的数值中减去较小的数值时,您得到的本质上就是Euclid算法,这意味着您将碰到一对( g , g ),其中g = GCD( m , n ); 并且只有g = 1时,该对才在S中 。在我看来,上述方程中目标数量c的x和y可能值恰好是S中的值 。 不过,这部分基于直觉。 要使其更加严格,还需要做更多的工作。
import java.util.*;
import java.math.BigInteger;
public class Main
{
private static boolean result(long a, long b, long c)
{
long M=c%(a+b);
return (M%b == 0) || (M%a == 0);
}
}
想法:c = xa + by,因为x或y更大,我们可以用以下两种形式之一写后一个方程:c = x(a + b)+(yx)b,c = y(a + b)+ (xy)a取决于谁更大,因此通过每次将c减小a + b,c最终变为:c =(yx)b或c =(xy)b,因此c%b或c%a的计算结果为0。
如果我们暂时忘记x
和y
应该为正,则方程c = xa + yb要么没有,要么有很多解。 当c不是gcd(a,b)的倍数时,没有解。
否则,调用gcd(a,b)= t使用扩展的欧几里得算法找到d和e,使得t = da + eb。 然后通过c = dc / ta + ec / t b给出一种解决方案。
显然0 = b / ta-a / tb,因此可以通过将等式的倍数f加到方程中来找到更多解:
c = (dc + fb)/t a + (ec - af)/t b
现在,当我们重新引入x和y必须为正或零的限制时,问题就变成了寻找使x =(dc + fb)/ t和y =(ec-af)/ t均为正或零的f值。
如果dc <0,请尝试使dc + fb> = 0的最小f,然后查看ec-af是否也> = 0。
否则,尝试使ec-af> = 0的最大f(负数),并检查dc + fb> = 0。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.