题解 P2955 [USACO09OCT]奇数偶数Even? Odd?

· · 题解

其实这一题本质很简单:判断一个数是奇数还是偶数

可是要命的是数据范围

看到很多人用字符串完成此题,其实不用字符串也能完成,代码还很简单

先分析一下如何判断一个数的奇偶性。

一般我们判断一个数字是否是2的倍数用x%2x&1其实它们同样适用于溢出后变成的负数

例:(以int为例,其实其他数据类型都可以)

输入的x x的二进制表示 (bool)(x%2) (bool)(x&1)
\quad2147483647\quad \quad01...1(31个1)\quad \quadtrue\quad \quadtrue\quad
\quad2147483648\quad \quad10...0(\!\color{#1278BC}\text{补码}\!)(31个0)\quad \quadfalse(溢出,此时其实x存储的是-2147483648)\quad \quadfalse\quad

(但cin和scanf貌似不是简单地溢出,要用输入优化)

这样问题就变简单了:输入一个int,判断它是否是偶数

奉上代码:(巨丑)

#include<bits/stdc++.h>
using namespace std;
inline int read()
{
    char ch=getchar();
    int x=0;
    while(ch<'0'||ch>'9')ch=getchar();
    while(ch>='0'&&ch<='9')
        {
            x=x*10+ch-48;
            ch=getchar();
        }
    return x;
}
int main()
{
    int n=read();
    while(n--)
        if(read()&1)puts("odd");
        else puts("even");
}

卡常、卡长(代码长度)之后的代码:

#include<stdio.h>
inline int read()
{
    register char ch=getchar();
    register int x=0;
    while(ch>'9'||ch<'0')ch=getchar();
    while(ch<='9'&&ch>='0')x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    return x;
}
int main()
{
    int n=read();
    while(n--)(read()&1)?(puts("odd")):(puts("even"));
}

话说一开始我没看数据范围直接上去打然后直接A掉了
吐槽:你谷表格崩了几年了。。。