快速幂
if(n%2==1) 等价 if( n&1 )
位与
&是位与操作符,n&1, n的最低位是1 1&1 就是 1
不是将n的二进制形式与00000000 00000001按位做与操作。这时,只要n的最右边一位是1,结果就不是0,为true,条件成立。
所以这句话实际上就是if(n%2==1)
#include <iostream>
using namespace std;
int f( int a, int b ) //二分求幂(一般)
{
int r = 1, base = a;
while( b != 0 )
{ if( b % 2 )
r *= base;
base *= base;
b /= 2;
}
return r;
}
int main(int argc, char *argv[])
{
int a,n;
while(cin>>a>>n)
cout<<f(a,n)<<endl;
return 0;
}
#include <iostream>
using namespace std;
int f( int a, int b ) //快速求幂(位操作)
{
int r = 1, base = a;
while( b != 0 )
{ if( b & 1 )
r *= base;
base *= base;
b >>= 1;
}
return r;
}
int main(int argc, char *argv[])
{
int a,n;
while(cin>>a>>n)
cout<<f(a,n)<<endl;
return 0;
}
#include <iostream>
using namespace std;
int f( int a, int n )
{
if(n==0) return 1; //普通递归
if(n%2==1) return a*f(a,n/2)*f(a,n/2);
else return f(a,n/2)*f(a,n/2);
}
int main(int argc, char *argv[])
{
int a,n;
while(cin>>a>>n)
cout<<f(a,n)<<endl;
return 0;
}
#include <iostream>
using namespace std;
int f( int a, int n )
{
int t ; // t 保存 以前计算的 -------记忆式搜索
if(n==0) return 1;
t=f(a,n/2);
if(n%2==1) return a*t*t;
else return t*t;
}
int main(int argc, char *argv[])
{
int a,n;
while(cin>>a>>n)
cout<<f(a,n)<<endl;
return 0;
}
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步