您的位置:首页 > 其它

区域赛之位运算

2016-04-30 15:09 141 查看
题目: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,然而并没有进位,所以说着只在这个题目里面适用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: