鸡兔同笼(程序1-11)
例题 鸡兔同笼: 已知鸡和兔的总数量为 n, 总腿数为 m。 输入 n 和 m,依次输出鸡的数目和兔的数目。 如果无解, 则输出 No answer。
样例输入: 14 32
样例输出: 12 2
样例输入: 10 16
样例输出: No answer
设鸡有 a 只, 兔有 b 只, 则 a + b = n, 2a + 4b = m, 联立解得 a =( 4n-m)/ 2, b = n-a。 在什么情况下此解“不算数” 呢? 首先, a 和 b 都是整数; 其次, a 和 b 必须是非负的。 可以通过下面的程序判断:
C 语言程序:
#include <stdio.h>
int main() { int a, b, n, m; scanf("% d% d", &n, &m); a = (4* n- m)/ 2; b = n- a; if( m % 2 == 1 || a < 0 || b < 0) printf(" No answer\ n"); else printf("% d %d\ n", a, b); return 0;
}
Haskell 代码:
main = don <- getLinem <- getLinereturn [(a,b)|a <- [0.. read n], b <- [0.. read n], a + b == read n, 2*a + 4*b == read m]
看这代码,C语言可以去死了,哈哈哈!
Haskell 代码使用了列表推导式,也就是用描述法表达一个集合。这个方法适合用穷举法求解所有可能的解。
三整数排序(程序1-17)
例题 三整数排序: 输入 3 个整数, 从小到大排序后输出。
样例输入: 20 7 33
样例输出: 7 20 33
C语言代码:
#include <stdio.h>
int main() { int a, b, c; scanf("% d% d% d", &a, &b, &c); if (a <= b && b <= c) printf("% d %d %d\ n", a, b, c); else if (a <= c && c <= b) printf("% d %d %d\ n", a, c, b); else if (b <= a && a <= c) printf("% d %d %d\ n", b, a, c); else if (b <= c && c <= a) printf("% d %d %d\ n", b, c, a); else if (c <= a && a <= b) printf("% d %d %d\ n", c, a, b); else if( c <= b && b <= a) printf("% d %d %d\ n", c, b, a); return 0;
}
Haskell 代码:
sort a b c| a <= b && b <= c = [a,b,c]| a <= c && c <= b = [a,c,b]| b <= a && a <= c = [b,a,c]| b <= c && c <= a = [b,c,a]| c <= a && a <= b = [c,a,b]| otherwise = [c,b,a]main = do a <- getLineb <- getLinec <- getLinereturn (sort a b c)
Haskell 代码是不是看起来更舒服一些?