快速幂
1 取模(求余)
1.1 数据溢出
计算2022^2022的后四位
#include<stdio.h>
int main()
{
int a = 1;
int i;
for(i=0;i<2022;i++)
{
a = a*2022%10000;
}
printf("%d",a);
return 0;
}
1.2 判断奇偶
x%2==0; //偶
x%2==1; //奇
位运算判断奇偶
x&1==1; //奇
x&1==0; //偶
2 快速幂
求2022 ^ 10000000000(10 ^10)
2.1 分治法
2022 ^ 10000000000 = 2022 ^ 100000 * 2022 ^ 100000
2022 ^ 100000 = 2022 ^ 100 * 2022 ^ 100 * 2022
……
#include<stdio.h>
int count=0;
int fastPow(int a,int n)
{
if(n==1)
{
count++;
return a%10000;
}
else if(n%2==1)
{
count++;
int temp=fastPow(a,n/2);
return temp*temp%10000*a%10000;
}
else
{
count++;
int temp=fastPow(a,n/2);
return temp*temp%10000;
}
}
int main()
{
int n;
int a=2022;
int res;
scanf("%d",&n);
res = fastPow(a,n);
printf("%d %d",res,count);
return 0;
}
2.2 快速幂(幂次、二进制)
例:a ^ 11 = a ^ 8 * a ^ 2 * a = a^(8+2+1)
11转换为二进制为1011 = 2 ^ 3 + 2 ^ 1 + 2 ^ 0 = 8+2+1
思路:将n和1做与运算,取相应二进制中最低位的数,1则乘,依次右移取完整个二进制数。
#include<stdio.h>
int fastPow(int a, int n)
{
int result = 1;
int count=0;
while(n)
{
if(n&1)
{
result = result*a%10000;
}
a=a*a%10000; //a^2, (a^2)^2=a^4, (a^4)^2=a^8 ……
n=n>>1;
count++;
}
printf("count=%d\n",count);
return result;
}
int main()
{
int a,n;
int x;
scanf("%d%d",&a,&n);
x = fastPow(a,n);
printf("%d",x);
return 0;
}