解方程
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
小璐有一天获得了一个形如 x | a = b的方程(a,b已知)
( |代表按位或)
她现在想要知道有多少个非负整数x能满足这个方程
聪明的你能帮帮她吗?
Input
多组输入,每组输入两个整数a,b
0<= a,b<= 10^8
Output
输出一个整数表示符合条件的非负整数解的个数
Example Input
2 3 0 1 1 0
Example Output
2
1
·0
对一组
a=2,b=3
2二进制位为1 0
3二进制位为1 1
故
x二进制位为1 1
或
x二进制位为1 0
即1|0=1
1|1=1
0|1=1
0|0=0
//创建日期2016/9/7
//源代码
#include <stdio.h>
#define max 100
int a[100]; //保存二进制每一位的个数
typedef int element;
typedef struct
{
element *top;
element *base;
int length;
}st;
void initstack(st *s) //构造空栈
{
s->base=(element *)malloc(max*sizeof(element));
s->top=s->base;
s->length=0;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
st s1,s2; //s1栈存a的二进制,s2栈存b的二进制
memset(a,0,sizeof(a));
initstack(&s1);
while(n)
{
*s1.top++=n%2;
n=n/2;
s1.length++;
}
initstack(&s2);
while(m)
{
*s2.top++=m%2;
m=m/2;
s2.length++;
}
//若两个二进制位数不同,短者补0
if(s2.length>s1.length)
{
while(s2.length>s1.length)
{
*s1.top++=0;
s1.length++;
}
}
else if(s2.length<s1.length)
{
while(s2.length<s1.length)
{
*s2.top++=0;
s2.length++;
}
}
int k=0;
while(s2.length--)
{
s2.top--;
s1.top--;
if((*(s2.top)==1)&&((*(s1.top)==1)))
{
a[k++]=2;
}
else if((*(s2.top)==0)&&((*(s1.top)==1)))
{
a[k++]=0;
}
else
{
a[k++]=1;
}
}
int sum=1,i; //sum计数
for(i=0;i<k;i++)
{
sum*=a[i];
}
printf("%d\n",sum);
}
return 0;
}
#define max 100
int a[100]; //保存二进制每一位的个数
typedef int element;
typedef struct
{
element *top;
element *base;
int length;
}st;
void initstack(st *s) //构造空栈
{
s->base=(element *)malloc(max*sizeof(element));
s->top=s->base;
s->length=0;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
st s1,s2; //s1栈存a的二进制,s2栈存b的二进制
memset(a,0,sizeof(a));
initstack(&s1);
while(n)
{
*s1.top++=n%2;
n=n/2;
s1.length++;
}
initstack(&s2);
while(m)
{
*s2.top++=m%2;
m=m/2;
s2.length++;
}
//若两个二进制位数不同,短者补0
if(s2.length>s1.length)
{
while(s2.length>s1.length)
{
*s1.top++=0;
s1.length++;
}
}
else if(s2.length<s1.length)
{
while(s2.length<s1.length)
{
*s2.top++=0;
s2.length++;
}
}
int k=0;
while(s2.length--)
{
s2.top--;
s1.top--;
if((*(s2.top)==1)&&((*(s1.top)==1)))
{
a[k++]=2;
}
else if((*(s2.top)==0)&&((*(s1.top)==1)))
{
a[k++]=0;
}
else
{
a[k++]=1;
}
}
int sum=1,i; //sum计数
for(i=0;i<k;i++)
{
sum*=a[i];
}
printf("%d\n",sum);
}
return 0;
}
342

被折叠的 条评论
为什么被折叠?



