在 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) / BBBAAA = 42BBB = -37TTT = 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)?

最大的异或

最大的异或

如果 x 在集合 L 中,如何使用 lambda 函数创建返回 true 的函数 L

JAVA面向对象解决实际问题实例