【发布时间】: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 倍吗?