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

    其实很好理解的,O(lg b)的时间复杂度,b是指数

    点我打开百科链接

    我就大概说一下。

    如果b = 11, 那么对应的二进制为1011,即答案

    11的二进制是1011

    11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1

    那么就刚好一一对应

    上代码(如果没有mod,数据很大,就要开高精度):

    unsiged long long fastpow(unsigned long long a, unsigned long long b)
    {
    	unsigned long long r = 1, t = a; //t先等于a,这样好算a^1,a^2,a^4...的,然后将结果乘上即可
    	while(b)
    	{
    		if(b & 1) //如果二进制末位有1,&是位运算与
    			r *= t; //有1,就将答案乘上t
    		t *= t; //更新a^i
    		b >>= 1; //向右移走一个1的位
    	}
    	return r;
    }

    如果题目有要mod的(即应该不用开高精度的):

    int fastmodpow(int a, int b, int c)
    {
    	int r = 1, t = a;
    	while(b)
    	{
    		if(!r) break; //当r为0后,将来的任何乘以就无意义,所以退出
    		if(b & 1)
    			r = (r * t) % c; //因为r和t都是mod过了的,所以在内部不用mod
    		t = (t * t) % c; //因为t是mod过了的,所以在内部不用mod
    		b >>= 1;
    	}
    	return r;
    }
  • 相关阅读:
    第八周进度条
    对老师的评价
    构建之法阅读笔记03
    构建之法阅读笔记02
    第七周进度条
    团队冲刺第二周07
    团队冲刺第二周06
    Java jdbc 连接oracle
    Java 生成验证码
    Oracle 触发器的简单命令
  • 原文地址:https://www.cnblogs.com/iwtwiioi/p/3521818.html
Copyright © 2011-2022 走看看