一、(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; }
三、已知道三个数的gcd、lcm求三个数字的可能数
给你一个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进制后有几个1
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++;
}