首页 > 编程语言 >请享用美味的快速幂算法-通俗易懂版

请享用美味的快速幂算法-通俗易懂版

时间:2023-07-21 11:44:35浏览次数:59  
标签:return 递归 奇数 int 享用 long 通俗易懂 美味 fastpower

一、算法整体思路

第1步

  按照最直接、最好理解的方式看,2的n次幂是n个2相乘,即有如下公式

  例如:

第2步
  然而为了节省大量时间,通过简单的思考和严格数学推理,我们不难理解以下结论:
  1.偶数幂的情况:
    通过幂函数运算法则,有2n=(2n/22,即有如下等式:

    例如24 的计算过程如下所示:

    得到上面的表达式后,22是不是可以继续按照这个思想分解下去?of course!现在只是举了一个4次方的例子,我们可以从此得到启发,发现求n次幂最终可以归结为不断的重复这个分解的一个过程,直到幂不能分解(幂为0了)才停下来。

    由此,上述过程可以描述为一个递归过程,递归基(递归结束条件)为”幂等于0“。得到以下递归表达式:

  小插叙:

    解释第二种情况前,有必要说明以下内容,这也是为什么第二种情况存在的原因:

    如果n是奇数,我们知道,在计算机中,n/2会舍去小数,这样如果继续按照上述第一步的方法分解,逆推回去,会发现最终得到的幂是n-1;不信,且看下例

 

  2.奇数幂的情况:

    好了,现在可以引出第二种情况,就是奇数幂的情况。我们要求得奇数幂的结果,可以从继续步骤1,即按照偶数幂的求法求出最终结果,再附加一个条件是,什么条件呢?

    就是在原来的结果上乘上一个2,原因我相信在插叙中已经说的很明白了,它少了1次幂,现在是在补上这一次幂,即:

   3.最终递归表达式

    那么到现在,我们可以写出完整的递归表达式了,在偶数幂的递归条件下,附加奇数幂的条件即可,即:

 

第3步

  我们现在对于快速幂的求解思路应当是已经十分清晰了,现在我们来写递归函数(C++):

long long int fastpower(int n){
    if (n == 0)//递归基
        return 1;
    else if (n % 2 == 0)//偶数幂的情况
        return square(fastpower(n / 2));
    else//奇数幂的情况
        return square(fastpower(n / 2)) * 2;
}
long long int square(long long int t){
    return t * t;
}

 

二、上刑
  everybody,现在我们已经完全理清了思路,接下来要把它整成代码吧!

#include<iostream>
using namespace std;

long long int fastpower(int n);//求解快速幂
long long int square(long long int t);//平方

int main(void){

    int n;
    cin >> n;//输入幂
    cout << fastpower(n);

    //固定模块初始线
    cout << endl;
    system("pause");
    return 0;
    //固定模块终止线
}

long long int fastpower(int n){
    if (n == 0)//递归基
        return 1;
    else if (n % 2 == 0)//偶数幂的情况
        return square(fastpower(n / 2));
    else//奇数幂的情况
        return square(fastpower(n / 2)) * 2;
}
long long int square(long long int t){
    return t * t;
}

希望能帮助到你,祝你学有所成!

标签:return,递归,奇数,int,享用,long,通俗易懂,美味,fastpower
From: https://www.cnblogs.com/MidsummerGo912/p/17570768.html

相关文章

  • 万年历matlab算法,万年历算法(万年历算法和分析)[通俗易懂]
    万年历matlab算法,万年历算法(万年历算法和分析)[通俗易懂]发布于 2022-07-2213:47:314460举报大家好,又见面了,我是你们的朋友全栈君。年历的计算方法:关键是求出当年1月1日是星期几。书上给出了当年份Y>。用蔡勒(Zeller)公式即w=y+[y/4]+[c/4]-2c+[26......
  • L27_用日语询问最美味的食物是什么
    语料的视频观看地址概述日语中询问从几样东西选哪个好,可以用:どれが一番~か的句式,比如どれが一番美味しいですか哪个最好吃どれが一番有名ですか哪个最有名どれが一番安いですか?哪个最便宜动画会话ご注文は?需要点什么?タムさん、何にする?Tam,你想吃什么?どれ......
  • Python中的*(星号)和**(双星号)详解 通俗易懂
    Python和C++不同,并没有指针,因此python中的*号作用和C++中不同。网上对于这方面的教程写的啰啰嗦嗦,一点不简明扼要。看的让人找不到重点。我这里快速的讲解一下。1.最简单的不用细说,是一个乘法运算符号a=1b=2c=a*b输出c当然是1×2=2。相信这并非是大家关心的重点。2.收集列表中多......
  • 通俗易懂,什么是.NET Core以及.NET Core能做什么
    我们都知道.NETCore是一个可以用来构建现代、可伸缩和高性能的跨平台软件应用程序的通用开发框架。可用于为Windows、Linux和MacOS构建软件应用程序。与其他软件框架不同,.NETCore是最通用的框架,可用于构建各种软件,包括Web应用程序、移动应用程序、桌面应用程序、云服务、微服务、......
  • 通俗易懂!像使用SQL一样使用Pandas进行数据筛选等复杂操作
    相对于学习Pandas各种数据筛选操作,SQL语法显得更加简洁清晰,若能够将SQL语法与Pandas中对应的函数的使用方法关联起来,对于我们应用Pandas进行数据筛选来讲无疑是一个福音。本文通过Pandas实现SQL语法中条件过滤、排序、关联、合并、更新、删除等简单及复杂操作,使得我们对方法的理......
  • 三菱FX5U七轴标准程序,程序通俗易懂,包含轴点动,回零,相对与绝对定位, 整个项目的模块都有:
    三菱FX5U七轴标准程序,程序通俗易懂,包含轴点动,回零,相对与绝对定位,整个项目的模块都有:主控程序,复位程序,手动,生产计数,只要弄明白这个程序,就可以非常了解整个项目的程序如何去编写,从哪里开始下手,可提供程序问题解答,程序流程清晰明了;包含有触摸屏程序ID:4322656150303995......
  • 免费享用ChatGPT4.0小技巧,构思方式新颖巧妙,可借鉴,独家分享
    文/高扬(微信公众号:量子论) 现在大家免费使用的ChatGPT都是GPT-3.5版本,可是我就想使用GPT-4版本怎么办,而且我还不想购买OpenAI的Plus会员…… 我是这样考虑的,作为大语言模型,我们并不知道GPT-3.5和GPT-4是不是同一个模型。 不如我们先猜测它们归属同一种模型,只是OpenAI的......
  • NC208250 牛牛的最美味和最不美味的零食
    题目链接题目题目描述牛牛为了减(吃)肥(好),希望对他的零食序列有更深刻的了解,所以他把他的零食排成一列,然后对每一个零食的美味程度都打了分,现在他有可能执行两种操作:eatk:吃掉当前的第k个零食。右边的零食全部往左移动一位(编号减一)。queryij:查询当前第i个零食到第j个零食里面......
  • ***通俗易懂【动态规划】01背包问题
    问题描述有n个物品,它们有各自的体积和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?为方便讲解和理解,下面讲述的例子均先用具体的数字代入,即:eg:number=4,capacity=8i(物品编号)1234w(体积)2345v(价值)3456 总体思路根据动态规划解题步骤(问题抽象化、建立模型、寻找约束条......
  • 前端必须学会的vueh5布局瀑布流 简易通俗易懂 左右排版
    css简易版瀑布流布局通过v-if="index%2===0"v-if="index%2===1"进行判断显示左边右边左右瀑布流排版,在每一列中交替地排放元素。具体来说,可以通过对每一列进行编号,然后对奇数列和偶数列分别设置不同的样式来实现左右瀑布流排版。html<div><cl-pull-refreshv-model="isR......