1.3按位AND和按位OR
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
已知长度为n的两个位串a和b,求它们的按位AND和按位OR。
Input
多组测试数据,每组测试数据第1行输入位串长度n(0 < n <= 64),第2行输入n个以空格隔开的取值为0或1的整数表示位串a,第3行输入n个以空格隔开的取值为0或1的整数表示位串b。
Output
每组测试数据占两行,第一行输出n个以空格隔开的取值为0或1的整数表示a位串和b位串的按位AND,第2行输出n个以空格隔开的取值为0或1的整数表示a位串和b位串的按位OR。
Sample Input
5 1 0 0 1 0 0 0 0 1 1
Sample Output
0 0 0 1 0 1 0 0 1 1
Hint
Source
xry-fhf
按位AND运算和按位OR运算其实就和联结词相似。
按位AND运算其实就是当两者都为真时才是真,就是a[i]=b[i]=1时输出1,其余情况输出0。联结词上就是等值式。
按位OR运算其实就是当有真则真,全假则假,就是a[i]==1||b[i]==1就输出1,其余情况输出0。联结词上就是析取运算。
详情见AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[100];
int b[100];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
for(int i=0;i<n;i++)
{
if(i==n-1)
{
if(a[i]==1&&b[i]==1)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
else
{
if(a[i]==1&&b[i]==1)
{
printf("1 ");
}
else
{
printf("0 ");
}
}
}
for(int i=0;i<n;i++)
{
if(i==n-1)
{
if(a[i]==1||b[i]==1)
{
printf("1\n");
}
else
{
printf("0\n");
}
}
else
{
if(a[i]==1||b[i]==1)
{
printf("1 ");
}
else
{
printf("0 ");
}
}
}
}
return 0;
}
再给出一个稍微简洁一点的代码。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
int a[100],b[100];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
for(int i=0;i<n;i++)
{
if(i==n-1)
{
printf("%d\n",a[i]&&b[i]);
}
else
{
printf("%d ",a[i]&&b[i]);
}
}
for(int i=0;i<n;i++)
{
if(i==n-1)
{
printf("%d\n",a[i]||b[i]);
}
else
{
printf("%d ",a[i]||b[i]);
}
}
}
return 0;
}