在 Java 42L + -37L * X == 17206538691L 中找不到 X 的值
Posted
技术标签:
【中文标题】在 Java 42L + -37L * X == 17206538691L 中找不到 X 的值【英文标题】:Cannot find the value of X in Java 42L + -37L * X == 17206538691L 【发布时间】:2017-11-19 08:01:07 【问题描述】:Long AAA = 42L;
Long BBB = -37L;
Long TTT = 17206538691L;
问题是不知道 X 应该是方程的值:
AAA + BBB * X == TTT
这应该找到 X 的值,但它已关闭
Long X = TTT / BBB - AAA;
这一直返回false
Boolean Matched = AAA + BBB * X == TTT;
Long Result = AAA + BBB * X;
System.out.println(X.toString()+" Matched "+Matched.toString()+" Result "+Result.toString());
【问题讨论】:
你的等式不应该是:X = (TTT - AAA) / BBB
吗?
你在问一个基本的数学问题吗?
1) 你的公式是错误的。 AAA + BBB * X == TTT
表示 X = (TTT - AAA) / BBB
。 --- 2) 结果是-465041585.10810810810810810810811
,即不是一个 integer 值。 --- 3) 不要使用盒装物品。将 Long
更改为 long
。或者更确切地说,发给double
(参见#2)。 --- 对于所有投票结束为“仅数学”问题的人:你错了。诚然,问题的数学很差,但它也是一个使用整数数学计算非整数结果的编程问题。
@OHGODSPIDERS X = (TTT - AAA) / BBB
与 AAA = 42
、BBB = -37
和 TTT = 17206538691
根据我方便的 Windows 计算器应用程序给出 X = (17206538691 - 42) / -37 = 17206538649 / -37 = -465041585.10810810810810810810811
。
@Andreas 是的,在发布后几秒钟意识到我的错误并删除了评论。猜猜当你使用便宜的计算器时会发生这种情况,它只是在不告诉你的情况下四舍五入。
【参考方案1】:
尚不完全清楚您在寻找什么,但请注意,java 长算法实际上是在 mod 264 中完成的。您可以自己研究模逆和扩展欧几里得算法,以及 java 如何处理整数溢出。如本例所示,BigInteger 类可以相对轻松地进行这些实验。
public class Main
static long AAA = 42L;
static long BBB = -37L;
static long TTT = 17206538691L;
private static long solve()
// compute x = inverse(BBB, 1<<64) * (TTT - AAA)
BigInteger two_64 = BigInteger.ONE.shiftLeft(64);
BigInteger BBB_inverse = BigInteger.valueOf(BBB).modInverse(two_64);
return BBB_inverse.multiply(BigInteger.valueOf(TTT - AAA)).longValue();
public static void main(String[] args)
System.out.println(solve());
这表明答案是 -5982727808154625893L。
这仅在BBB
是奇数时有效。
【讨论】:
每个人都对 OP 嗤之以鼻,但这是一个有意义的问题,这是正确的答案。 这个解决方案解决了我非常感谢的问题,谢谢以上是关于在 Java 42L + -37L * X == 17206538691L 中找不到 X 的值的主要内容,如果未能解决你的问题,请参考以下文章
Java每日算法--罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
Java:如何实现 Dancing Links 算法(使用 DoublyLinkedLists)?