Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1879661
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2388
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(184)

文章存档

2021年(26)

2020年(56)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: C/C++

2018-09-06 21:15:25

今天之所以要连在昨天之后紧跟一篇,是因为昨天更新完之后,看了这个函数的源代码,瞬间觉得自己弱爆了,不废话,先贴代码:

点击(此处)折叠或打开

  1. template <class T, class Integer, class MonoidOperation>
  2. T power(T x, Integer n, MonoidOperation op) {
  3.   if (n == 0)
  4.     return identity_element(op);
  5.   else {
  6.     while ((n & 1) == 0) {
  7.       n >>= 1;
  8.       x = op(x, x);
  9.     }

  10.     T result = x;
  11.     n >>= 1;
  12.     while (n != 0) {
  13.       x = op(x, x);
  14.       if ((n & 1) != 0)
  15.         result = op(result, x);
  16.       n >>= 1;
  17.     }
  18.     return result;
  19.   }
  20. }
说实话,我之前在应届生去面试的时候,就被人问过这道题目,怎么算x的y次方,当时想的是分奇数和偶数递归,但是知道昨天拷到这个,瞬间明朗了。。。
第一步判断n是否为0;
第一个while循环,尽可能的将底数变的更大,更好进行后续的计算,经过第一个while之后,n肯定是一个奇数了,再进入第二个循环,如果是1,则直接返回。
第二个while循环感觉就是求当前底数(x的偶数次平方,y)的奇数(m)次平方的过程,也就是求m的二进制各个位是否为1的过程,如果当前位M为1,则结果额外乘以y的2^M次方~
拜服了~~~
阅读(2620) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~