原理
把b转换成
二进制数。
该二进制数第i位的权为
例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算
代码比较
常规求幂
int pow1( int a, int b )
{
int r = 1;
while( b-- )
r *= a;
return r;
}
二分求幂(一般)
int pow2( int a, int b )
{
int r = 1, base = a;
while( b != 0 )
{
if( b % 2 )
r *= base;
base *= base;
b /= 2;
}
return r;
}
快速求幂(位操作) a&1 即a%2
int pow3( int a, int b )
{
int r = 1, base = a;
while( b != 0 )
{
if( b & 1 )
r *= base;
base *= base;
b >>= 1;
}
return r;
}
按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。 例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。
正数的补码
正整数的补码与
原码相同。
【例1】+9的补码是00001001。(备注:这个+9的补码是用8位2
进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)
负数的补码
求负整数的补码,符号位不变,数值位各位取反,最后整个数加1。
【例2】求-5的补码。
因为给定数是负数,则符号位为“1”。
后七位:-5的原码(10000101)→符号位不变(10000101)→数值位取反(11111010)→加1(11111011)
所以-5的补码是11111011。
【例3】数0的补码表示是
唯一的。
[+0]补=[+0]反=[+0]原=00000000
[ -0]补=11111111+1=00000000
HDU 1061
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
ll quick(ll a,ll b,ll c)
{
ll r=1,base=a;
while(b!=0)
{
if(b&1)r=r*base%c;
base=base*base%c;
b>>=1;
}
return r;
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cout<<quick(n,n,10)<<endl;
}
return 0;
}