用 Haskell 求解 ACM 竞赛题(5):for 循环

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/quicmous/article/details/83926496

for 循环

考虑这样一个问题: 打印 1, 2, 3,…, 10, 每个 占 一行。
本着“ 解决问题 第一” 的思想, 很容易写出程序: 10 条 printf 语句就可以了。 或者也可以写一条, 每个数 后面加 一个“\ n” 换行符。 但如果把 10 改成 100 呢? 1000 呢? 甚至这个重复次数是可变的:“ 输入正整数 n, 打印 1, 2, 3,…, n, 每个占一行。” 又怎么办呢? 这时可以使用 for 循环。

程序 2-1: 输出 1, 2, 3,…, n 的 值

C语言代码:

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

Haskell 代码:

nums 0 = []
nums n = (nums (n - 1)) ++ [n]

main = do   
    s <- getLine
    return (nums (read s))

Haskell 语言采用递归定义实现 C 语言循环语句功能。

完全平方数

问题 aabb 输出所有形如 aabb 的 4 位完全平方数(即前两位数字相等, 后两位数字也相等)。

【分析】分支和循环结合在一起时功能强大: 下面枚举所有可能的 aabb, 然后判断它们是否 为完全平方数。 注意, a 的范围是 1 ~ 9, 但 b 可以是 0。 主程序如下:

C语言代码:

#include <stdio.h> 
#include <math.h> 
int main() { 
	for (int a = 1; a <= 9; a++) 
		for(int b = 0; b <= 9; b++) { 
			int n = a* 1100 + b* 11; //这里 才 开始 使用 n, 因此 在这里 定义
			int m = floor(sqrt(n) + 0. 5); 
			if (m*m == n) printf("% d\ n", n); 
		} 
	return 0;
}

Haskell语言代码:

isSqr' n m
    | m == 0    = False
    | n == m*m  = True
    | otherwise = isSqr' n (m-1)
isSqr n = isSqr' n (n-1)
    
main = do return [n | a<-[1..9], b<-[0..9], let n = 1100*a+11*b, isSqr n]

在 haskell 中,可以用列表推导式解决数据遍历、数据暴力穷举类型的问题。

猜你喜欢

转载自blog.csdn.net/quicmous/article/details/83926496