知识点:快速幂运算
快速幂运算;
原来:当我们计算a^k时候,一定是(a*a*a*a*……a) k个
现在: 把k拆成二进制,为了表达清楚,我们这里让k=11
11(dec)=1011(b)=1*2^3+0*2^2+1*2^1+1*2^0 我们会发现其中有0的地方是个废操作
那么我们将去除这个废操作的过程叫做快速幂运算
2^11=2^1011=(2^1*2^3)*(2^ 0*2^2 )*( 1*2^1 ) *( 1*2^0 )= (2^1*2^3)* ( 1*2^1 ) *( 1*2^0 )
我们把上面的每一位的二进制用b(i)表示 2^(b(i)*2^i)= 2^(b(i)*2^(i-1)*2)= ( 2^(b(i)*2^(i-1)2))^2
= 2^(b(i)*2^(i-1)2)*2^(b(i)*2^(i-1)2)
这么做的目的是便于我们的算法,后者=前者的平方
那么算法就写好了
__int64(__int64 a,int k)
{
__int64 s=1;
while(k)
{
if(k&1)//作一个与运算,这边就是在判断二进制的最后一位是否是1
{
s=s*a
}
a=a*a//后者=前者的平方
k>>=1;// 将k右移移动一位,循环判断二进制是否是0,是0就不作运算
}
returrn s;
}
这样就OK了。。。
快速幂运算;
原来:当我们计算a^k时候,一定是(a*a*a*a*……a) k个
现在: 把k拆成二进制,为了表达清楚,我们这里让k=11
11(dec)=1011(b)=1*2^3+0*2^2+1*2^1+1*2^0 我们会发现其中有0的地方是个废操作
那么我们将去除这个废操作的过程叫做快速幂运算
2^11=2^1011=(2^1*2^3)*(2^ 0*2^2 )*( 1*2^1 ) *( 1*2^0 )= (2^1*2^3)* ( 1*2^1 ) *( 1*2^0 )
我们把上面的每一位的二进制用b(i)表示 2^(b(i)*2^i)= 2^(b(i)*2^(i-1)*2)= ( 2^(b(i)*2^(i-1)2))^2
= 2^(b(i)*2^(i-1)2)*2^(b(i)*2^(i-1)2)
这么做的目的是便于我们的算法,后者=前者的平方
那么算法就写好了
__int64(__int64 a,int k)
{
__int64 s=1;
while(k)
{
if(k&1)//作一个与运算,这边就是在判断二进制的最后一位是否是1
{
s=s*a
}
a=a*a//后者=前者的平方
k>>=1;// 将k右移移动一位,循环判断二进制是否是0,是0就不作运算
}
returrn s;
}
这样就OK了。。。