蟠桃记《快速幂》(两种解法)

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

该方法只要取出表格即可。但是如果取的数比较少,第一种算法更好。但是第二种方法,在非常多的取数时更有优势,
因为不需要计算。
posted @ 2018-03-26 22:40  神韵袖藏  阅读(287)  评论(0编辑  收藏  举报