二进制中1的个数
解法:自己与比其小1的数按位与,即可得到1的个数
//计算一个数的二进制中1的个数
#include <iostream>
using namespace std;
//求1的个数
int solve(int x)
{
int cnt = 0;
while(x){
cnt++;
x=x&(x-1);
}
return cnt;
}
//判断需要改变多少为才能将数a变成b,异或操作
int change(int a,int b)
{
return solve(a ^ b);
}
int main()
{
int x;
while(cin>>x){
cout<<solve(x)<<endl;
}
int a,b;
while(cin>>a>>b){
cout<<change(a,b)<<endl;;
}
}
判断机器大小端
//判断大小端
#include<iostream>
using namespace std;
int main()
{
short a = 0x0102;
char *p = (char *)&a;
printf("%c\n",(*p)+'a');
//输出c,表示高位高字节,低位低字节 高位放在高地址 即小端
//输出b,表示高位低字节,地位高字节 高位放在低地址 即大端
}
寻找发帖水王,一个数在一个数组中超过一半,怎么样找出这个数
解法:每次取出两个数,如果相同,则保留,并且相应的计数加1,如果不同,则两个数都删去,则最后剩下的数绝对是超过一半的那个数。
扩展:发帖水王扩展 有三个超过了四分之一,找出这个数
解法:相同的思路,只不过这次就每次取4个进行比较,全部不同就全删除,则剩余的三个即为所求值
#include <iostream>
using namespace std;
const int N = 100;
int A[N] = {1,2,2,5,1,5,1,5,2,1,5,2,9};
int n;
//超过一半
int solve()
{
int curr = 0;
int currn = 0;
int i,j;
for(i = 0; i < n; i++){
if(currn == 0){
curr = A[i];
currn++;
}else{
if(curr == A[i])
{
currn++;
}else{
currn--;
}
}
}
cout<<curr<<endl;
return curr;
}
//超过四分之一
int solve1_1_4()
{
int curr1 = 0;
int curr2 = 0;
int curr3 = 0;
int currn1 = 0;
int currn2 = 0;
int currn3 = 0;
int i,j;
for(i = 0; i < n; i++){
if(currn1 == 0){
curr1 = A[i];
currn1++;
continue;
}
if(curr1 == A[i])
{
currn1++;
continue;
}
if(currn2 == 0)
{
curr2 = A[i];
currn2++;
continue;
}
if(curr2 == A[i])
{
currn2++;
continue;
}
if(currn3 == 0)
{
curr3 = A[i];
currn3++;
continue;
}
if(curr3 == A[i])
{
currn3++;
continue;
}
currn1--;
currn2--;
currn3--;
}
currn1 = currn2 = currn3 = 0;
for(i=0;i<n;i++){
if(A[i] == curr1)
currn1 ++;
else if(A[i] == curr2)
currn2++;
else if(A[i] == curr3)
currn3++;
}
cout<<curr1<<" "<<curr2<<" "<<curr3<<endl;
if(currn1 >= n/4)
return curr1;
else if(currn2 >= n/4)
return curr2;
else if(currn3 >= n/4)
return curr3;
else return -1;
}
int main()
{
n = 13;
solve();
solve1_1_4();
}