2007年10月16日星期二

传闻是EMC的一道笔试题

http://bbs.chinaunix.net/thread-918458-1-1.html

函数原形已经给出:int p(int i, int N);
功能:调用该函数,打印如下格式的输出,例p(1, 7);
1
2
3
4
5
6
7
6
5
4
3
2
1
即每行一个数字。(注意:N只打印一次)
要求:
函数中唯一能够调用的函数就是printf。
只使用一条语句,如果你真的不能用一条语句,每增加一条语句扣1分。
不准使用如下的关键字:typedef, enum, do, while, for, switch, case, break, continue, goto,
until, if, ..具体很多我也忘了,反正能用的不多。
不能使用逗号表达式和?:表达式。
标准:(总分10分)
1. 每多一条语句扣1分,即每多一个;就扣1分
2. 每使用一次if或?:扣2分
3. 每使用一次for,while, swith各扣4分
大体上就是如上的要求了。


水牛们给出的答案:
1.
int p( int i, int N ){
return ( printf( "%d\n", i ) && N > 1 && p( i+1, N-1 ) && printf( "%d\n", i ) ) + 1;
}

2.
如果不递归的话,能不能做出来呢?
我觉得还是有可能的。
只需要用 flwlibc 不要用 glibc 就可以。
printf( "%*v", N, i );

3.非递归
int p (int i, int N)
{
return i < 2*N
&& printf ("%d\n", N - (N-i) * (2*(i
&& (*((int volatile *)&i - 1) -= 5) && ++(*(int volatile *)&i);
}

4.正确的
这个是通用的正确的代码:
int p(int i, int n)
{
return i<=n && printf("%d\n", i) &&( !p(i+1, n) || printf("%d\n", i));
}
p(1,7),p(2,9)... i