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

team109

2019-02-03 15:47:06

Solution

**其实这一题本质很简单:判断一个数是奇数还是偶数** ~~可是要命的是数据范围~~ ### 看到很多人用字符串完成此题,其实不用字符串也能完成,代码还很简单 ___ *** $ $ $ $ ##### 先分析一下如何判断一个数的奇偶性。 $ $ 一般我们判断一个数字是否是2的倍数用`x%2`或`x&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{补码}\!$](https://baike.baidu.com/item/补码/6854613?fr=aladdin)**)(31个0)$\quad$|$\quad$false(溢出,此时其实x存储的是-2147483648)$\quad$|$\quad$false$\quad$| (**但cin和scanf貌似不是简单地溢出,要用输入优化**) $ $ $ $ $ $ ### 这样问题就变简单了:输入一个int,判断它是否是偶数 *** 奉上代码:(巨丑) ```cpp #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"); } ``` 卡常、~~卡长~~(代码长度)之后的代码: ```cpp #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掉了~~ 吐槽:你谷表格崩了几年了。。。