1,回文数:
判断回文数最快的方法可以考虑将数字的前一半和后一半进行比较,如果相等就说明该数字是回文数。
具体地,我们可以将整数转成字符串,然后使用双指针法判断字符串是否是回文的。
下面是一个 Java 实现:
public boolean isPalindrome(int x) {
String s = String.valueOf(x);
int i = 0, j = s.length() - 1;
while (i < j) {
if (s.charAt(i) != s.charAt(j)) {
return false;
}
i++;
j--;
}
return true;
}
这个方法的时间复杂度为 $O(n)$,其中 $n$ 是输入数字的位数。如果要进一步优化时间复杂度,可以直接在数字上进行操作,而不用转成字符串,具体实现方法见我的另一个回答。
也可以用StringBuilder里面的reverse方法和原方法进行比较 , 当然如果字符串较长 不建议使用;
2,快速幂
快速幂是指通过对幂运算的指数进行二进制拆分,从而将幂运算的时间复杂度降低到 $O(\log n)$ 的算法。在取模意义下进行快速幂运算,常常被用来解决大数取模问题。
Java 实现的快速幂模板如下:
public static long quickPow(long a, long b, long mod) {
long res = 1;
while (b > 0) {
if ((b & 1) == 1) {
res = res * a % mod;
}
a = a * a % mod;
b >>= 1;
}
return res;
}
其中,参数 a 表示底数,b 表示指数,mod 表示模数。函数返回底数 a 的指数 b 次方取模 mod 的结果。这里使用了位运算来实现二进制拆分。
例如,在计算 $a^b\ \mathrm{mod}\ m$ 的时候,可以调用 quickPow(a, b, m) 函数,并将其返回值作为结果即可。
例题1: 幂幂
问题描述
给出a,b,c。令p=1000000007, z=b^c, y=a^z, x=y mod p。请求出x。
输入格式
三个整数分别是a,b,c
输出格式
请输出x
样例输入
2 2 2
样例输出
16
数据规模和约定
abc都不超过10^9
Java代码如下:
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); int p = 1000000007; long z = quickPow(b, c, p - 1); long y = quickPow(a, z, p); System.out.println(y); } // 快速幂算法 public static long quickPow(long x, long n, int mod) { long res = 1; while (n > 0) { if (n % 2 == 1) { res = res * x % mod; } x = x * x % mod; n /= 2; } return res; } }
步骤解析:
1. 首先输入a、b、c三个数和模数p。
2. 计算z=b^c mod (p-1),其中(p-1)是因为根据费马小定理,a^(p-1)=1(mod p),因此a^z的值只与z模(p-1)的余数有关。
3. 计算y=a^z mod p,这里可以直接调用快速幂算法,以提高计算效率。
4. 输出x=y。需要注意的是,对于较大的整数求幂时,需要使用快速幂算法以降低时间复杂度。此外,在计算完乘积后需要及时取模避免溢出。
例题2 : 快速幂
package 算法提高;
import java.util.Scanner;
public class 快速幂002 {
public static