数论—快速幂
幂运算:c=a^b
一:
对于a和b比较小的情况下,可以直接用a*a*a*……来求解
[/demo]
#include<bits/stdc++.h>
using namespace std;
int f(int a,int b)
{
if(b==0)return 1;
int x=1;
for(int i=0;i<b;i++)
x*=a;
return x;
}
int main()
{
int a,b;
int ans=0;
while(scanf("%d%d",&a,&b))
{
ans=f(a,b);
printf("%d\n",ans);
ans=1;
}
return 0;
}
[/demo]
二:
如果b比较大,上述方法要进行b次乘法运算,耗时就会很大,这时应选用快速幂算法
其主要理论依据如下:
1,当b为偶数时,a^b可以转为a^2的b/2次方。
2,当b为奇数时,a^b可以转为a^2的b/2次方,再乘以a。
而a^2的b/2次方,以可以使用上述方式转为a^4的b/4次方再乘以某个数。
代码实现:
int f(int a,int b)
{
int s=1;
while(b>0)
{
if (b%2 == 1)
{//b=b>>1保证了在最后一步肯定会执行该if判断
s=s*a;
}
a=a*a;
b=b>>1;
}
return s;
}
在每一次进行循环时,如果b为奇数,则a^b可以转为a^2的b/2次方乘以a。所以每一次进行a^2计算时,需要根据b是否为奇数决定是否在最终的结果上乘以a。
a = a*a;此步计算完成后,则a是下一个进行平方运算的数。这样当所有的循环结束后,a就是a^k,其中k是离b最近的,且为2的整数次方的数。
利用快速幂方法可以迅速求出一个数的任意次方。
例如求a^b%10000
[/demo]
#include<cstdio>
using namespace std;
int f(int a,int b)
{
int s=1;
while(b>0)
{
if(b%2==1)
{
s=s%10000;
a=a%10000;
s=s*a;
}
a=a%10000;
a=a*a;
b=b>>1;
}
return s%10000;
}
int main()
{
int a,b;
int ans;
while(scanf("%d%d",&a,&b))
{
ans=f(a,b);
printf("%d\n",ans);
}
return 0;
}
[/demo]