zoukankan      html  css  js  c++  java
  • 蟠桃记《快速幂》(两种解法)

    这道题比较容易所以解法也并不唯一。但是我们主要通过这道题讲解快速幂的算法。
    题目如下:
     
    喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!
    什么问题?他研究的问题是蟠桃一共有多少个!
    不过,到最后,他还是没能解决这个难题,呵呵^-^
    当时的情况是这样的:
    第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子。聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢?

    Input输入数据有多组,每组占一行,包含一个正整数n(1<n<30),表示只剩下一个桃子的时候是在第n天发生的。Output对于每组输入数据,输出第一天开始吃的时候桃子的总数,每个测试实例占一行。Sample Input

    2
    4

    Sample Output

    4
    22


    数学公式法:
    通过对题中的归纳很容易得到一个数列表达式每一天的为3*2^(n-1)-2;(就是一个高中的数列销项法)
    那么现在最大的工作就交给a^b了。
    快速幂有几种方法在这里不一一讲解。
    快速幂的目的是快速求幂,如果将按普通的算法将会是O(n)的,但是使用快速幂将会是log(n)大大加快速度
    我们知道任何一个数都可以转化为2进制的数字。如11转化位1011,11=2^3*1 + 2^2*0+2^1*1+2^0*1;
    看将一个循环11的变成了计算三次是不是快了很多。
    由于使用到了二进制那么一定会使用>>和&了。
    &运算符通常用于二进制取位操作。还可以判断奇偶数。比如X&1==0;X为偶数。是因为&取出了最后有一位。而二进制中
    最后一位为0必定是偶数。
    >>运算符单纯二进制去掉最后一位。(请查一查相关二进制运算符在算法中的相关使用。本博客也会在后面的文章中补充)

    代码如下:
    int pow(int a,int b)
    {
      int ans=1,base=a;
    while(b!=0)
    {
      if(b&1!=0)
      ans*=base;
      base*=base;
      b>>=1;
    }
    return ans;
    }

    该解法最关键得两个点已经告诉读者所以,只要读者自己去实现代码即可。
    解法二:(制表)
    int num[30];
    num[0]=1;
    for(int i=1;i<30;i++)
    {
    num[i]=(num[i-1]+1)*2;
    }

    该方法只要取出表格即可。但是如果取的数比较少,第一种算法更好。但是第二种方法,在非常多的取数时更有优势,
    因为不需要计算。
  • 相关阅读:
    LeetCode Power of Three
    LeetCode Nim Game
    LeetCode,ugly number
    LeetCode Binary Tree Paths
    LeetCode Word Pattern
    LeetCode Bulls and Cows
    LeeCode Odd Even Linked List
    LeetCode twoSum
    549. Binary Tree Longest Consecutive Sequence II
    113. Path Sum II
  • 原文地址:https://www.cnblogs.com/damaoranran/p/8654608.html
Copyright © 2011-2022 走看看