题目:https://www.bnuoj.com/v3/external/gym/100818.pdf
这道题目用的就是位运算,还有字符输入,这道题要求的比较高,各种卡,卡时间卡内存,在这道题上学到好多,字符输入比int型输入要耗费时间,特别是位运算,下面先上代码
#include<stdio.h>
#include<string.h>
long int sum;
char v;
long int qqq()
{
long int s;
if(v>='0'&&v<='9')
{
s=v-'0';
sum=sum*10+s;
v=getchar();
return qqq();
}
else
return sum;
}
int main()
{
long int a,sun;
int b,k,i,j;
int q[40];
sun=0;
memset(q,0,sizeof(q));
scanf("%d%d",&b,&k);
getchar();
for(i=0; i<b; i++)
{
v=getchar();
sum=0;
a=qqq();
// printf("%ld\n",a);
// printf("%ld\n",a);
for(j=1; j<=32; j++)
if((1<<j)&a)
q[j]++;
}
for(i=1; i<=32; i++)
{
if(q[i]%k!=0)
sun+=1<<i;
}
printf("%ld\n",sun);
return 0;
}
这个字符输入时我自己写的,用的是递归,下面的位运算是学长的,if((1<<j)&a)是判断该二进制位上是否是1, sun+=1<<i;这是后面开始排除,只要有不同的就加到一起,
感觉这个真的很神奇,位运算真是一个强大的东西。
另外还有一段学长写的字符输入代码
inline LL read() { int c=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-')f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { c=c*10+ch-'0'; ch=getchar(); } return c*f; }
其中还判断正负号了,但其实这个题目根本没有必要,还是学长考虑的比较谨慎吧,这个是直接用的while循环,也比较好。
对了,还有一点,|(或)的意思其实是和加的意思是一样的(只是在这个题目里面是加的意思),主要是1|1=1,然而并没有进位,所以说着只在这个题目里面适用。