【问题标题】:Find the modo value查找 modo 值
【发布时间】:2017-08-19 10:34:21
【问题描述】:

我给了一个对数值Y,我想计算Y的反对数,即

ans = (Math.pow(10,Y))%mod

其中mod = 1e9+7 和 Y 的反对数将始终为整数,即
Y 计算如下Y= log(a) a is very large integer of range 10^100000

所以对于给定的 Y,我需要计算 ans 吗?考虑到 mod 操作如何做到这一点。

我的方法

double D = Y -(int)Y
long Pow = (long)Y

  for(int i=1;i<=Pow;i++) ans = (ans*10)%mod;

  ans = (ans*Math.pow(10,D))%mod

但是有人建议在这里采取有效的方法是不正确的吗? BigDecimal 在那里有用吗?
例如:

Y = 16.222122660468525

使用直接的方法并四舍五入,即Math.log(10,Y) 给我1667718169966651,但使用循环它给我16677181699666510。我现在没有使用 mod 只是解释有一个错误。

这里Y 很小,所以直接的方法很有效,我们可以很容易地接受mod。如果 Y 是 10000 的范围,它将不起作用并溢出,所以我们必须使用 mod。

【问题讨论】:

  • 确认一下,这里的日志是log(a)还是log10(a)?为什么Math.pow(Math.E, (Math.log(a))) 不努力寻找反对数?
  • @nullpointer 它的底数为 10
  • Math.pow(10, (Math.log(a)))怎么了?
  • @nullpointer 我已经更新了一个例子
  • 您是否正确复制并粘贴了结果?您确定 1) 您没有遗漏额外的“6”,并且 2) 这两个结果相差 10 倍吗?

标签: java algorithm numbers


【解决方案1】:

我想它应该可以工作

double D = Y -(int)Y
long Pow = (long)Y

for(int i=1;i<=Pow;i++) ans = (ans*10)%mod;

 ans = (ans*Math.pow(10,D))
 ans = Math.round(ans)
 ans%=mod

【讨论】:

  • Y 很大时我认为它不准确
【解决方案2】:

这里你的判断有误——循环方法没有错

在您的示例中,a 的值有 17 个整数位。从 this stackoverflow post 开始,double 的精度约为 16 位有效数字。因此循环和直接计算实际上都受到缺乏精度的限制。

(只是为了确认,使用high precision calculatora 的值是16677181699666650.8689546562984070600381634077...。因此您的两个值都不正确 - 除非您错误地复制它们?)

因此,您的循环方法不是问题;你只需要一个 更高精度的方法来做最后一步(计算pow(10, frac(Y)))。


附带说明,循环部分有一种更有效的方法 - this post 有更多详细信息。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 2016-10-21
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2012-09-26
    相关资源
    最近更新 更多