结论:任何数都可以写成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

算是基本公式了,不会的可以看看,不用死记硬背,重在理解

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐