zoukankan      html  css  js  c++  java
  • C++求快速幂

    “快速幂”被归结为一个a的b次方对m取余的问题,即

    ab % m

    问题的关键在于怎么更快地求得ab,直观的做法是用b次循环去累乘a,时间复杂度是O(b)。而“快速幂”,又成为“二分幂”,通过二分的思想能在O(logb)的复杂度内求得ab

    如果次数b是奇数,则ab可以拆解为a*ab-1

    如果次数b是偶数,则ab可以拆解为ab/2*ab/2

    奇数拆解一次就会变成偶数,且这么拆解下去,最后需要计算b0,而b0 = 1。然后再依次回退计算即可,显然这是递归的思路,又是一种空间换时间的做法。

    代码:

    #include <iostream>
    using namespace std;
    
    int binaryPower(int a, int b, int m)
    {
    	if (b == 0)
    		return 1;
    	else if (b % 2 == 1)
    		return a * binaryPower(a, b - 1, m) % m;
    	else
    	{
    		int mul = binaryPower(a, b/2, m) % m;
    		return mul * mul;
    	}
    }
    
    int main()
    {
    	cout << binaryPower(2, 4, 3) << endl;
    	cout << binaryPower(2, 5, 7) << endl;
    	return 0;
    }
    

    输出:
    1
    4
    

    避免整型溢出,可以定义更大的数据类型long long。

  • 相关阅读:
    spark hbase
    Benchmark简介
    Flink的安装配置
    Hive入门及常用指令
    hadoop+yarn+hbase+storm+kafka+spark+zookeeper)高可用集群详细配置
    Linux最常用的命名
    数据库的零散的总结
    DBA总结
    MySQL主从架构配置
    mysql主从读写分离,分库分表
  • 原文地址:https://www.cnblogs.com/banmei-brandy/p/14406564.html
Copyright © 2011-2022 走看看