题解 P2955 [USACO09OCT]奇数偶数Even? Odd?
team109
2019-02-03 15:47:06
**其实这一题本质很简单:判断一个数是奇数还是偶数**
~~可是要命的是数据范围~~
### 看到很多人用字符串完成此题,其实不用字符串也能完成,代码还很简单
___
***
$ $
$ $
##### 先分析一下如何判断一个数的奇偶性。
$ $
一般我们判断一个数字是否是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掉了~~
吐槽:你谷表格崩了几年了。。。