快速求幂运算

 1 #include <stdio.h>
 2 #include <math.h>
 3 //递归算法
 4 int recursion(int a,int b)
 5 {
 6     int tem = 1;
 7     if(b==0)return 1;
 8     else if(b==1)return a;
 9     tem = recursion(a,b>>1);
10     tem = tem*tem;
11     if(b&1) tem = tem * a;
12     return tem;
13 }
14 //循环算法
15 int loop(int a,int b)
16 {
17     int tem=1,ret=a;
18     while(b>0)
19     {
20         if(b&1) tem = tem * ret;
21         ret = ret*ret;
22         b>>=1;
23     }
24     return tem;
25 }
26 int main()
27 {
28     int a,b;
29     while(1)
30     {
31     printf("For a^b input a and b:");
32     scanf("%d%d",&a,&b);
33     printf("The recursion method:\n");
34     printf("%d\n",recursion(a,b));
35     printf("The loop method:\n");
36     printf("%d\n",loop(a,b));
37     }
38     return 0;
39 }

原理:

对应于递归算法,以下是算法依据:

直接乘要做998次乘法。但事实上可以这样做,先求出2^k次幂:

3 ^ 2 = 3 * 3
3 ^ 4 = (3 ^ 2) * (3 ^ 2)
3 ^ 8 = (3 ^ 4) * (3 ^ 4)
3 ^ 16 = (3 ^ 8) * (3 ^ 8)
3 ^ 32 = (3 ^ 16) * (3 ^ 16)
3 ^ 64 = (3 ^ 32) * (3 ^ 32)
3 ^ 128 = (3 ^ 64) * (3 ^ 64)
3 ^ 256 = (3 ^ 128) * (3 ^ 128)
3 ^ 512 = (3 ^ 256) * (3 ^ 256)

再相乘:

以下是对应非递归算法:

3 ^ 999
= 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3

时间: 2024-08-03 06:21:10

快速求幂运算的相关文章

快速求幂运算笔记

如何快速求x得n次方呢? 首先C++里面有个pow如何实现呢?自己查查,里面使用double,肯定更麻烦,还有jianzhi 我们会顺手写下 int res=1; for(int i=1;i<=n;i++) { res*=x; } 学习一下快速幂,logn内计算出来,使用N的二进制,只需要logN就可以计算. 正要的就是计算每个为1对应的基数.列入: 11是多少?是二进制的话,就是1*2^1+1 那么x^(11)呢,两个1对应的基数是多少呢?低位1对应的是X,高位1对应的是X^2,因此,就是位于

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: ?

快速求幂模

今天我要介绍的是快速求幂模,在开始介绍之前,我们先看看如何快速求幂.这里我要介绍的是二分求幂. 二分求幂的原理如下: 下面,我们将这个公式转换成代码: 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

求幂运算、多项式乘法及Horner法则的应用

一,两种不同的求幂运算 求解x^n(x 的 n 次方) ①使用递归,代码如下: 1 private static long pow(int x, int n){ 2 if(n == 0) 3 return 1; 4 if(n == 1) 5 return x; 6 if(n % 2 == 0) 7 return pow(x * x, n / 2); 8 else 9 return pow(x * x, n / 2) * x; 10 } 分析: 每次递归,使得问题的规模减半.2到6行操作的复杂度为

A sequence of numbers(快速求幂)

题目描述 Xinlv wrote some sequences on the paper a long time ago, they might be arithmetic or geometric sequences. The numbers are not very clear now, and only the first three numbers of each sequence are recognizable. Xinlv wants to know some numbers in

快速求幂

快速幂在算指数时是很高效的,他的基本原理是二进制. 如果要算 2^5,可以直接2*2*2*2*2 但是如果要算 3^999,指数N太大,计算太慢,所以有一种快速的解法. @@@@@@@@@@@@@@@@@@@@@@@@ 以3^21为例. 2^21=(2^16)×(2^4)×(2^1) 21的二进制可以写成(10101)----------------而10101可以写成1*2^4+0*2^3+1*2^2+0*2^1+1*2^0 可以明显看出, 每一个香对应着上边的指数.   2^4=16 2^2

高效求幂运算

//说明: //高效求幂运算(递归) //输入:整数X,幂次N //输出:X^N //时间复杂度:O(logN) #include<iostream> using namespace std; int Pow(int X,int N) { if(N==0) return 1; else if(N==1) return X; else if(N%2==0) return Pow(X*X,N/2); else return Pow(X*X,N/2)*X; } void main() { cout&

斐波那契加求幂运算

斐波那契博大精深啊,还有求幂的迭代也有点意思 1 //斐波那契有好多中方法 2 #include <iostream> 3 #include <deque> 4 using namespace std; 5 6 //注意普通斐波那契,在太大数时就会发生越界,比如long long 只能存表示第92个数,这些都是小的斐波那契,当要大时,就得用大数方法了 7 //用int ,只能到第46个,47就不行了,unsighed int 只能到92 8 int fibnaq(int n) //

快速求幂 POW优化

#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; int pow(int x, int n) { int result = 1; while (n > 0) { if (n % 2==1) result *= x; x *= x; n /=2 ; } return result; } int main()