区域赛之位运算

题目: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,然而并没有进位,所以说着只在这个题目里面适用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值