Java 如果c比b小得多,找到**b%c(a幂b模c)的最佳方法是什么?
我已经在java中为Java 如果c比b小得多,找到**b%c(a幂b模c)的最佳方法是什么?,java,algorithm,math,exponential,integer-arithmetic,Java,Algorithm,Math,Exponential,Integer Arithmetic,我已经在java中为biginger尝试了modPow()函数。 但需要的时间太长了 我知道模乘,甚至是指数运算 但由于受到限制,我无法解决这个问题 a,b的值可以包含1000000个数字(这么大,不是吗)? 现在我想找到(a**b)%c。 作为第一步,我们可以做a=a%c。 但在这里,即使是b也是如此巨大 c=10^9+7尝试使用此功能。它使用一些JS引擎来计算任何东西。 将表达式作为字符串参数并运行它 private void calculateExpression(String exp){
biginger
尝试了modPow()
函数。但需要的时间太长了 我知道模乘,甚至是指数运算 但由于受到限制,我无法解决这个问题
a
,b
的值可以包含1000000
个数字(这么大,不是吗)?
现在我想找到(a**b)%c
。
作为第一步,我们可以做a=a%c
。
但在这里,即使是b
也是如此巨大
c=10^9+7
尝试使用此功能。它使用一些JS引擎来计算任何东西。
将表达式作为字符串参数并运行它
private void calculateExpression(String exp){
try {
//calling a JS engine which helps us to calculate what we need
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");
Object result = engine.eval(exp);
//checking if we got any error
if (result.toString().equals("Infinity") || result.toString().equals("NaN")){
System.out.println("Can't divide with zero");
}
else if (result != null){
Double doubleResult = new Double("" + result);
//checking if the result is an int value
if ((doubleResult == Math.floor(doubleResult)) && !Double.isInfinite(doubleResult)) {
text.setText("" + (doubleResult.longValue()));
}
else {
//means that it's double value
text.setText(result.toString());
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}
不确定在这种情况下TLE是什么?模幂运算的标准算法可以轻松处理百万位数的指数。这肯定不会是你用
b
@BrianJ做的最慢的事情:modPow
不是已经有效地做到了吗?用哪种语言?Java还是C?或者两者都有?关于TLE的寓意:不要使用TLA。@thang:当然。看一看。由于c
非常小,很容易分解,因此我们可以使用该定理来减小指数。在通用的modPow
之后,函数很容易就足够快了。对不起,这显然太慢了。所以,即使它能在某个时候提供结果,那也太晚了。好吧,但它能提供你需要的解决方案吗?我不需要它。根据OP,直接的算法太慢了。看看评论,我暗示了正确的解决方案。欢迎您全部使用。