解方程(按位或)

解方程

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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值