快速幂

原理

把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。
同一个数字在不同的补码表示形式中是不同的。比如-15的补码,在8位二 进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2 进制来表示。
【例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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值