读取两个整数,判断乘积奇偶;用 Haskell 练习基础输入解析和字符串输出。
OJ: atcoder
题目 ID: abc086_a
难度:入门
标签:模拟haskell
日期: 2026-07-09 19:36
题意
给定两个正整数 a 和 b,判断它们的乘积 a * b 是奇数还是偶数。
如果乘积是奇数,输出 Odd;如果乘积是偶数,输出 Even。
思路
这题没有复杂算法,只需要观察乘积的奇偶性:两个数相乘时,只要其中一个数是偶数,乘积就是偶数;只有两个数都是奇数时,乘积才是奇数。
可以用下面这张表理解:
a 的奇偶 |
b 的奇偶 |
a * b 的奇偶 |
|---|---|---|
| 奇数 | 奇数 | 奇数 |
| 奇数 | 偶数 | 偶数 |
| 偶数 | 奇数 | 偶数 |
| 偶数 | 偶数 | 偶数 |
代码里直接计算 a * b 再取模即可:
haskell
let c = a * b
let res = if c `mod` 2 == 0 then "Even" else "Odd"Haskell 读入
这一行负责把输入中的两个整数读出来:
haskell
[a,b] <- map read . words <$> getContents :: IO [Int]它可以按下面的顺序理解:
getContents读取所有标准输入,类型是IO String。<$>把右边IO String里的字符串取出来后,交给左边的函数处理。words把输入字符串按空白字符拆成["3", "4"]这样的列表。map read把字符串列表转成整数列表[3, 4]。[a,b] <- ...把两个整数分别绑定到a和b。
这里的 :: IO [Int] 是类型标注,用来告诉 Haskell:读出来的列表元素应该解析成 Int。
WA 点:print 和 putStrLn
注意输出字符串时要用 putStrLn res。如果写成 print res,Haskell 会按照 Show String 的形式输出,结果会变成 "Even" 或 "Odd",多出双引号,提交会 WA。
也就是说:
haskell
putStrLn "Even"输出:
text
Even而:
haskell
print "Even"输出:
text
"Even"本题要求没有双引号,所以必须使用 putStrLn。
代码
haskell
{-
Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
rainboy的学习导航网站: https://idx.roj.ac.cn
create_at: 2026-07-09 19:45
update_at: 2026-07-09 19:45
-}
main :: IO ()
main = do
[a,b] <- map read . words <$> getContents :: IO [Int]
let c = a * b
let res = if c `mod` 2 == 0 then "Even" else "Odd"
putStrLn res复杂度
只读取两个整数并做一次乘法和取模。
- 时间复杂度:
。 - 空间复杂度:
。
总结
这题适合作为 Haskell 输入输出练习。判断逻辑是“乘积为偶数当且仅当至少有一个因子为偶数”,实现时可以直接计算乘积再判断。真正容易踩坑的是输出函数:putStrLn 输出裸字符串,print 会额外带上双引号。