二分求幂

2017-07-20 17:47:25

writer:pprp

介绍:二分求幂原理:

一般用递归求解:

代码如下:

int power(ll base,unsigned int exponent)
{
    if(exponent == 0)
    {
        return 1;
    }
    if(exponent == 1)
    {
        return base;
    }
    double result = power(base,exponent>>1);
    result *= result;
    if(exponent%2 == 1)
        result *= base;
    return result;
}

属于数论,遇到具体的题目还是有点问题

时间: 2024-10-25 19:07:14

二分求幂的相关文章

二分求幂,快速求解a的b次幂

一个引子 如何求得a的b次幂呢,那还不简单,一个for循环就可以实现! void main(void) { int a, b; int ans = 1; cin >> a >> b; for (int i = 1; i <= b; i++) { ans *= a; } cout << ans; } 那么如何快速的求得a的b次幂呢?上面的代码还可以优化吗? 当然是ok的!下面就介绍一种方法-二分求幂. 二分求幂 所谓二分求幂,即是将b次幂用二进制表示,当二进制位k位

二分求幂(快速求幂,二进制求幂)

二分求幂, 非递归求法(二进制求法): 比如 2^5就是5个2相乘,按照5的二进制求 3^10就是8个3相乘,再2个3相乘. 处理幂的二进制,具体实现代码如下: long long quickmulti(long long a,long long b) { long long res=1; while(b) { if(b&1) //如果最后一位为1,则res*=a; res*=a; a*=a; //a*=a b>>=1; //b%=2 } return res; }

数学问题-二分求幂例题

例 4.10 人见人爱 A ^ B  题目描述 求 A^B 的最后三位数表示的整数.说明:A^B 的含义是“A 的 B 次方” 输入 输入数据包含多个测试实例,每个实例占一行,由两个正整数 A 和 B 组成 ( ),如果 A=0, B=0,则表示输入数据的结束,不做处理. 输出 对于每个测试实例,请输出 A^B 的最后三位表示的整数,每个输出占一行. 样例输入 2 3 12 6 6789 10000 0 0 样例输出 8 984 1 解题代码 #include<cstdio> int main

HDU 3461 Code Lock(并查集+二分求幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3461 A lock you use has a code system to be opened instead of a key. The lock contains a sequence of wheels. Each wheel has the 26 letters of the English alphabet 'a' through 'z', in order. If you move a

题目1441:人见人爱 A ^ B(二分求幂)

题目链接:http://ac.jobdu.com/problem.php?pid=1441 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1441 人见人爱 A ^ B.cpp // Jobdu // // Created by PengFei_Zheng on 15/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include

NYOJ--102--次方求模(快速求幂取模)

次方求模 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 求a的b次方对c取余的值 输入 第一行输入一个整数n表示测试数据的组数(n<100)每组测试只有一行,其中有三个正整数a,b,c(1=<a,b,c<=1000000000) 输出 输出a的b次方对c取余之后的结果 样例输入 3 2 3 5 3 100 10 11 12345 12345 样例输出 3 1 10481 1 /* 2 Name: NYOJ--102--次方求模 3 Copyright: ?

整数求幂

问题描述:求一个整数的n次幂,对m取余. 思路一:简单循环 1 int Pow(int num, int n, int m) 2 { 3 int res = 1; 4 5 while (n--) { 6 res *= num; 7 } 8 9 return res % m; 10 } 以上代码有个隐患,当n足够大的时候,res会溢出,因此需要优化. 有这样一个公理:两个数的积对另一个数取余,等于这两个数分别对第三个数取余的乘积再对第三个数取余.也就是a*b%c = (a%c)*(b%c)%c 根

一份对于求幂方法的总结

关于乘方 1.最基本的求幂方法(同于数据极弱的题): int temp=con; for(int i=2;i<=a;i++) temp*=con: 可以低效求出con的a次方. 例题:输入二个正整数a,b,求a^b的值. #include<iostream> using namespace std; int main() { int a,b; scanf("%d%d",&a,&b); int temp=a; for(int i=2;i<=b;i+

快速求幂模

今天我要介绍的是快速求幂模,在开始介绍之前,我们先看看如何快速求幂.这里我要介绍的是二分求幂. 二分求幂的原理如下: 下面,我们将这个公式转换成代码: int cifang(int a,int n)//返回值是a的n次方 { int res=1;//任何数的0次方都等于1,所以初始化为1 while(n != 0) { if(n%2 == 1)//如果n是奇数 res *= a;//就要多乘一次,即res = res*a; a = a*a; n /= 2;//二分,即n = n/2 } retu