<谭> 6.15 两个乒乓球队进行比赛, 各出三人。甲队为A、B、C三人,乙队为X、Y、Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比。请编程序找出三赛手的名单。分析:① X既不与A比,又不与C比,必然与B比;② C既不与X比,又不与Z比,必然与Y比;③ A只能与Z比.以上为逻辑推理得到结论,而用计算机处理此问题,必须对所有组合一一检验,看是否符合条件。#include <stdio.h>int main(){ char _A, _B, _C; /* 分别表示A,B,C的对手 */ for(_A = 'X'; _A <= 'Z'; _A++) for(_B = 'X'; _B <= 'Z'; _B++) for(_C = 'X'; _C <= 'Z'; _C++) if(_A != _B && _A != _C && _B != _C && _A != 'X' && _C != 'X' && _C != 'Z') printf("A--%c\tB--%c\tC--%c\n", _A, _B, _C); return 0;}运行结果:==============================A--Z B--X C--Y==============================★ 这里为了在运行时能直接打印出字符'X'、'Y'、'Z', 用了字符变量_A,_B,_C 。另外为了减少循环次数,可由外层到内层去除不符合的组合。书中例子如下:#include <stdio.h>int main(){ char i, j, k; /* 分别表示A,B,C的对手 */ for(i = 'X'; i <= 'Z'; i++) for(j = 'X'; j <= 'Z'; j++) if (i != j) for(k = 'X'; k <= 'Z'; k++) if (i != k && j != k) if(i != 'X' && k != 'X' && k != 'Z') printf("A--%c\tB--%c\tC--%c\n", i, j, k); return 0;}运行结果同上。★ 考查两个程序循环次数的差异,做如下验证:#include <stdio.h>int main(){ char _A, _B, _C, count = 0; for(_A = 'X'; _A <= 'Z'; _A++) for(_B = 'X'; _B <= 'Z'; _B++) for(_C = 'X'; _C <= 'Z'; _C++) count++; printf("count=%d\n", count); return 0;}运行结果:======================count=27======================#include <stdio.h>int main(){ char i, j, k, count = 0; for(i = 'X'; i <= 'Z'; i++) for(j = 'X'; j <= 'Z'; j++) if (i != j) for(k = 'X'; k <= 'Z'; k++) if (i != k && j != k) count++; printf("count=%d\n", count); return 0;}运行结果:======================count=6====================== ★ 可见后者循环次数比前者少的多。

评论