我正在尝试将 1020 乘以 275 次方,并将其修改为 1073,但 java 不会输出正确的答案

Posted

技术标签:

【中文标题】我正在尝试将 1020 乘以 275 次方,并将其修改为 1073,但 java 不会输出正确的答案【英文标题】:I am trying to take 1020 to the 275th power, and modding that by 1073, but java wont output the right answer 【发布时间】:2018-04-23 16:45:37 【问题描述】:

我正在开发一个解码器,我需要将 1020 的 275 次方,然后修改为 1073,但是当我尝试这样做时,它不会打印出正确的答案

    double decoded = (1020^275)%1073;

这是我正在尝试的代码,但它会打印出 751,它应该打印 4,有人有什么提示吗?

【问题讨论】:

^ 不是幂运算符。 "1020^275" - 这不是幂函数,而是按位异或。即使它是幂函数,1020275th 次方也将是一个带有825 数字的数字(至少)。无法将其放入double 搜索模幂 【参考方案1】:

^xor 运算符;但是,1020 的 275 次方是一个 HUGE 数字,即使使用 doublelong溢出,所以应该用 BigInteger 表示:

System.out.println(BigInteger.valueOf(1020).pow(275).mod(BigInteger.valueOf(1073)));

输出:

4

注意:我使用了BigInteger#mod,但BigInteger#remainder 在您的情况下会返回相同的值(因为您只处理非负值)。

【讨论】:

绝对推荐BigInteger 而不是BigDecimal,如果你知道整数是必需的。【参考方案2】:

您可以使用BigInteger.pow(),后跟BigInteger.mod()

但是 BigInteger 类专门包含在您的任务的操作中:BigInteger.modPow()

System.out.println(BigInteger.valueOf(1020).modPow(BigInteger.valueOf(275), BigInteger.valueOf(1073)));

给出 4。

【讨论】:

【参考方案3】:

试试这个:

BigDecimal remainder = new BigDecimal(1020).pow(275).remainder(new BigDecimal(1073));
System.out.println(remainder);

应用余数后,可以将其转换为long,其最大值将为1072(在这种情况下):

remainder.longValueExact();

【讨论】:

我保存为什么数据类型 BigDecimal。不能使用 Double/Long,因为 ti 会溢出这个巨大的数字。可以使用remainder.longValueExact() 将其转换为长值【参考方案4】:

double 是有界的,有精度限制,试试:

System.out.println(Math.pow(1020, 275));  // Infinity

通常,您应该使用BigDecimalBigInteger 来操作大数字,

BigDecimal bigDecimal = new BigDecimal(1020);
bigDecimal = bigDecimal.pow(275);
bigDecimal = bigDecimal.remainder(new BigDecimal(1073));
System.out.println(bigDecimal); //4

【讨论】:

【参考方案5】:
Xor is differ from power function. 2 ^ 3, The output of an XOR gate is true only when exactly one of its inputs is true. If both of an XOR gate's inputs are false, or if both of its inputs are true, then the output of the XOR gate is false.
double maximum value = 1.7976931348623157E308
Actually (1020^275) = 2.3176467070363862212063591722218e+827 which greater than double maximum value.

Go with BigDecimal.

System.out.println(new BigDecimal(1020.0).pow(275).remainder(new BigDecimal(1073)));

【讨论】:

以上是关于我正在尝试将 1020 乘以 275 次方,并将其修改为 1073,但 java 不会输出正确的答案的主要内容,如果未能解决你的问题,请参考以下文章

从 GraphQL 计算一个值并将其保存在 Django 模型中

十六进制如何换成十进制。

如何将 BIM 360 文件的内容作为文件流读取并将其写入另一个流

旋转轴重映射?

SQL Server 2012 Express 如何从一列中提取信息并将其与具有表达式限制的另一列进行比较

Matlab Mex 文件 - 创建一个常量数组