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

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

可是要命的是数据范围

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



$ $

$ $

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

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

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

输入的x x的二进制表示 (bool)(x%2) (bool)(x&1)
$\quad$ 2147483647 $\quad$ $\quad$ 01...1(31个1) $\quad$ $\quad$ true $\quad$ $\quad$ true $\quad$
$\quad$ 2147483648 $\quad$ $\quad$ 10...0( $\!\color{#1278BC}\text{补码}\!$ )(31个0) $\quad$ $\quad$ false(溢出,此时其实x存储的是-2147483648) $\quad$ $\quad$ false $\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掉了
吐槽:你谷表格崩了几年了。。。


发表于 2019-02-03 15:47:06 in 题解