<谭> 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
======================
★ 可见后者循环次数比前者少的多。
评论