小技巧

一、(8&-8=8)    8(d)=(00001000)(b)       -8(d)=(11111000)(b)             注解:求2的k次,k为x二进制下末尾0的个数。

int lowbit(int x)

{

    return x&-x;

}

二、C++求二进制

void Binarycout(int n)  {   for (int i=31;i=0;i--)   {    cout〈〈((n〉〉i)&1);   }   cout〈〈endl;  }

三、已知道三个数的gcdlcm求三个数字的可能数

给你一个G和一个L,求有多少个有序的三个整数<x,y,z>,使得gcd(x,y,z)=G,lcm(x,y,z)=L

解法:

L若能整除G则有解。将L/G质数分解,假设因子p1的指数为a1,则x,y,z中至少一个数含有p1^a1,至少一个数不含p1,另一个数随便,所以对于p1而言方案数为2*C(2,3)+(a1-1)*A(2,3)6+6*a1-1

然后每个答案相乘。

四、错排公式

D(n) = (n-1) [D(n-2) + D(n-1)]

D(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!]

D(n) = [n! / e + 1/2]

五、判断10进制转2进制后有几个 

unsigned long fun(unsigned long data)
 {
   unsigned long  count =  0 ;
   unsigned long  x = data;
   while(x)
   {
            count++;
            x =  x  &   (x - 1);
    }
    return count;
 }

或者

int s=0;
 for(int n=0;n<sizeof(x)*8;n++)
 {
       if( x & (1 << n))
           s++;
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值