超级次方的思路探讨与源码
超级次方的题目如下图,该题属于数学类和分治类型的题目,主要考察对于递推方法的使用和题目数学思路的理解。本文的题目作者想到2种方法,分别是倒序遍历方法和正序遍历方法,其中倒序遍历方法使用Java进行编写,而正序遍历方法使用Python进行编写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
本人认为该题目可以倒序遍历方法的思路进行解决,首先实现一个倒序遍历计算次方的函数,该函数内部先进行初始化,然后判断当前传入数字是否为0,如果不为0则开始遍历,判断数字是否是奇数,如果是奇数则将数字进行倒序的迭代计算,直到遍历结束并返回结果。而在主函数内,先初始化一个数字,然后开始遍历循环,调用计算次方的函数后和当前的历史结果计算并进行取余数操作,直到循环遍历结束后,将最终结果返回。那么按照这个思路我们的Java代码如下:
#喷火龙与水箭龟
class Solution {
static final int IND = 1337;
public int superPow(int a, int[] b) {
int res = 1;
for (int ir = b.length - 1; ir >= 0;ir--) {
res = (int) ((long) res * pow(a, b[ir]) % IND);
a = pow(a, 10);
}
return res;
}
public int pow(int x, int n) {
int vex = 1;
while (n != 0) {
if (n % 2 != 0) {
vex = (int) ((long) vex * x % IND);
}
x = (int) ((long) x * x % IND);
n = n/2;
}
return vex;
}
}
显然,我们倒序遍历方法的效果一般,同时还可以使用正序遍历的方法解决。首先初始化参数,然后开始遍历循环,将结果直接调用系统的次方函数进行迭代正序计算,直到最终循环结束并返回结果。所以按照这个思路就可以解决,下面是Python代码:
#喷火龙与水箭龟
class Solution:
def superPow(self, a: int, b: List[int]) -> int:
NUM = 1337
res = 1
for jr in b:
res = pow(res, 10, NUM) * pow(a, jr, NUM) % NUM
return res
从结果来说Java版本倒序遍历方法的效率一般,而Python版本的正序遍历方法的速度也较为一般,但应该是有更多的方法可以进一步提速的,希望朋友们能够多多指教,非常感谢。