当前位置: 代码迷 >> 综合 >> 用 Haskell 求解 ACM 竞赛题(2):变量及其输入
  详细解决方案

用 Haskell 求解 ACM 竞赛题(2):变量及其输入

热度:18   发布时间:2023-12-12 16:23:49.0

上一节的程序虽好, 但有一个遗憾: 计算的数据是事先确定的。 为了计算 1 + 2 和 2 + 3, 下面不得不编写两个程序。 可不可以让程序读取键盘输入,并根据输入内容计算结果呢? 答案是肯定的。 程序如下:

程序 1- 4   a+ b 问题

#include<stdio.h> 
int main() { int a, b; scanf("% d% d", &a, &b); printf("% d\ n", a+ b); return 0; 
} 

该程序比上节的复杂了许多。 简单地说, 第一 条语句“ int a, b” 声明了两个整型( 即整数类型) 变量 a 和 b, 然后读取键盘输入, 并放到 a 和 b 中。 注意 a 和 b 前面 的“&” 符号—— 千万不要漏掉, 不信可以试试( 2)。 现在, 你的 程序已经读入两个整数, 可以在表达式中自由使用它们, 就好比使用 12、 597 这样的常数。 这样, 表达式 a+ b 就不难理解了。

Haskell 代码如下:

main = dos <- getLinet <- getLinelet a = read slet b = read treturn (a + b)

说明

  • let :目前可以理解为“赋值”语句。

也可以写成下面这个样子:

main = doa <- getLineb <- getLinereturn (read a + read b)

说明

  • read 字符串 :把字符串转换成数。

程序 1-5 圆柱体 的 表面积:输入底面半径 r 和高 h, 输出圆柱体的表面积, 保留 3 位小数,格式见样例。样例输入: 3. 59 样例输出:Area = 274. 889

【分析】 圆柱体的表面积由 3 部分组成: 上底面积、 下底面积和侧面积。 由于上下底面积 相等, 完整的公式可以写成:表面积 = 底面积 × 2+ 侧面积。

根据几何知识, 底面积 = π r 2 \pi r^2 πr2, 侧面 积 = 2 π r h 2\pi rh 2πrh。 不难写出完整程序:

#include <stdio.h> 
#include <math. h> 
int main() { const double pi = acos(- 1. 0); double r, h, s1, s2, s; scanf("% lf% lf", &r, &h); s1 = pi* r* r; s2 = 2* pi* r* h; s = s1* 2. 0 + s2; printf(" Area = %.3f\ n", s);return 0; 
}

这是本书中第一个完整的“竞赛题目”, 因为和正规比赛一样, 题目中包含着输入输出格式规定, 还有样例数据。 大多数的算法竞赛包含如下一些相同的“游戏规则”。 首先, 选手程序的 执行是自动完成的, 没有人工干预。 不要在用户输入之前打印提示信息(例如“ Please input n:”), 这不仅不会为程序赢得更高的“ 界面友好分”, 反而会让程序丢掉大量的( 甚至所有 的) 分数——这些提示信息会被当作输出数据的一部分。

ACM竞赛规则试根据 C 语言输入输出库设计的,这与 Haskell 的输入输出不一样,因此后面我用 Haskell 语言编写代码的时候,不再拘泥于 ACM 竞赛对 IO 格式的要求。

Haskell 代码:

main = dolet pi = 3.1415926535sr <- getLinesh <- getLinelet r = read sr :: Floatlet h = read sh :: Floatlet s1 = (pi*r*r) :: Floatlet s2 = (2.0*pi*r*h) :: Floatreturn (2.0*s1 + s2)

代码与 C 语言相仿。

  相关解决方案