1、一道C TRAPS上的习题,写一段程序使支持嵌套注释和不支持嵌套注释的两种编译器运行的结果不一样。
语句肯定是从嵌套注释的地方来构造,两种编译器不同的地方就在于符号的匹配。
/* /* */ " */ " /* " /* */或者/* /* / 0* / **/1都可以,可以说是构造一个二义性的文法。
2、第二题是一道笔试题,写个函数pp(a,b),(其中a<b)打印出如下结果:
a
a+1
...
b-1
b
b-1
...
a+1
a
比如pp(1, 5)
1
2
3
4
5
4
3
2
1
。
题目就是这样,写出一个这样的函数应该不难,但题目要求是只使用一条语句,这就无疑增加了难度,
那我们分析如何才能用一条语句来构造呢?首先按照题目的输出来看肯定有循环,那我们先简单些,不用循环语句来写,递归式很好的形式,
void p(int a, int b)
{
printf("%d\n", a);
if(a == b)
return ;
else
p(a+1, b);
printf("%d\n", a);
return ;
}
它为我们提供了一种转换的很好形式,因为没有用到while等循环形式,只有条件判断的话还是很好处理的可以使用?:或者&&和||的运算规则
int pp(int a, int b)
{
return printf("%d\n", a) && a!=b && (pp(a+1, b) || (!printf("%d\n", a)));
}
把第一个&&运算符改成,运算符也是可以的。
3、
How to solve it的一道题目,用数字0~9构造一组数,使它们的和等于100,其中每个数字有且只能出现一次。
答案是没有这一组数的,可以证明如下:
这些数最大肯定不会超过两位,那么假设十位数字之和为t
则应满足10t + (45-t) =100
结果是不存在这个整数。
证明过程巧妙地转换了问题性质,并用方程的形式表示了出来。