算法讲解6:快速幂
·
结论:任何数都可以写成2^n相加的形式
特点:快能把时间复杂度从O(n)砍成O(log(n)),一般不会单独出题
如果不用:我们在面对将一个数m乘以n次方的时候,一般都是直接暴力,比如n=5,m=6;
int a=1;
for(int i=1;i<=5;i++) a*=m;
这样时间复杂度就是n,用快速幂把它优化
思想:直接暴力就是不断处理a,但合理的动m会更快,把m变成其原本的平方--->事半功倍
直接上代码吧,输入是n,m,n代表乘的次方,m代表那个数,就是m的n次方
package 博客;
import java.util.Scanner;
public class 快速幂 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();//m的n次方
int Return =1;//最终结果
while(n!=0)
{
if(n%2==1)Return*=m;//涉及到取模运算的知识,在最末尾补充
/*
只有第一次以及偶数除到底会出现m是奇数的情况,
所以乘以的m必将是原版的,不会出问题
对于第一次m若为奇顺手补上m的1次方,对于最后一次则是把改变的m一次性乘给Return
*/
n/=2;//次方数4变2,2变1,直到n==0位置将n完全转化成相对分量的m
m*=m;//次方数1变2,2变4,Return的初始值相当于m的0次方
}
}
}
补充:
模的运算法则是指在模运算中,有以下几个基本规律和性质:
1. 加法的模运算:(a + b) mod n = (a mod n+ bmod n)mod n
2. 减法的模运算:(a - b) mod n = (a mod n- bmod n)mod n
3. 乘法的模运算:(a *b) mod n = (a mod n* bmod n)mod n
算是基本公式了,不会的可以看看,不用死记硬背,重在理解
更多推荐



所有评论(0)