参考https://blog.csdn.net/qq_32680617/article/details/50640622
参考https://www.cnblogs.com/tgycoder/p/5008480.html
第一种,普通做法
//最好想的吧,就是乘以n个a
int pow(int a,int n)//返回值是a的n次方
{
int result = 1;
for(int i = 1; i <= n; ++i)
{
//乘以n个a
result *= a;
}
return result;
}
第二种做法,二分
a^n = a ^ n/2 * a^n/2;
当n为奇数是时候还要乘以一个a
递归
int pow(int a,int n)//返回值是a的n次方
{
if(n == 0)
{
return 1;
}
if(n == 1)
{
return a;
}
//计算a^n/2
int result = pow(a, n / 2);
result *= result;
//如果为奇数,要再乘以一个a
if(n % 2 == 1)
{
result *= a;
}
return result;
}
非递归
int pow(int a,int n)//返回值是a的n次方
{
int result = 1;
while(n != 0)
{
if(n % 2 == 1)
{
result *= a;
}
a *= a;
n /= 2;
}
return result;
}
感觉非递归不太好理解,可能我太蠢了
就是把n转化成2进制
看一下别人的图
就是把5次方变成了(2^0+2^2)
那个if判断就是判断当前最后一位为1,因为只有为1的时候才会乘进去
n/2就是去掉最后一位,向前进。
a*= a,就是 比如你现在101,你计算到了最左边的1,此时的a就是4次方,所以在进行每一位计算的时候都用了a*a, 也就是a, a^2, a^4
然后快速幂,取模结合
也就是计算 a^b%c
可以转换为 (a%c)^b%c
也就是先让a对c取模,在进行计算
下面是代码
int pow(int a,int b, int c)
{
int result = 1;
a = a % c;
while(b != 0)
{
if(b % 2 == 1)
{
result = result * a % c;
}
a = a * a % c;
b /= 2;
}
return result;
}
(a + b) % n = ((a % n ) + (b % n)) % n
ab % n = (a % n) (b % n) % n