C语言中的变量名是允许用下划线的,哪怕你全部是下划线。
先替换一下,看的更清楚,如下:
程序代码:
#include <stdio.h>
#include <stdlib.h>
void function(int t2, int t3, int t4, int t5)
{
((t3 / t2) <= t5) ? function(t2,t3+t5,t4,t5) :
!(t3 % t2) ? function(t2,t3+t5,t3 % t2, t5) :
((t3 % t2)==(t3 / t2) && !t4) ? (printf("%d\n",(t3 / t2)),
function(t2,t3+t5,t4,t5)) : ((t3 % t2) > t5 && (t3 % t2) < (t3 / t2)) ?
function(t2,t3+t5,t4,t5 + !((t3 / t2) % (t3 % t2))) :
(t3 < t2 * t2) ?
function(t2,t3+t5,t4,t5) : 0;
}
int main() {
function(6,0,0,1);
}
接下来分析下函数的功能:
首先确认下,这个函数里有两个变量是永远不会变的,那就是t2和t4,这个结论很容易获得。
在看t3,这个变量的值基本上一直在变,从(t3 / t2) <= t5和t3 < t2 * t2这两句可以推出,t3的值在t2*(t5+1)和t2*t2之间变化。
例子中我把t2 = 6, t5 = 1,则t3的变化范围为12到36。
这个函数的功能是要找到一个数x,这个数满足什么条件呢?
1)即x%t2 == x/t2(t4永远为0,也即!t4永远为真),也就是说在12到36的范围内找到 x = 6*n + n 这样的数,n从2到5。然后打印x/6即打印n。
那么结果按理来说应该是2,3,4,5啊,为什么运行的结果只有2,3,5呢?
继续分析:
在范围内满足条件1的数有 14,21,28,35。为什么28的结果n = 4没有输出呢?
再看程序里有这样一句话:
t5 + !((t3 / t2) % (t3 % t2))..........(#)
即调整t5的大小,这句话要么使t5 += 1,要么t5保持不变。
当满足条件2:
2)(t3 % t2) > t5 && (t3 % t2) < (t3 / t2)即x%t2(余数)大于t5(1)并且余数小于x/t2(商)时才会发生#等式的调整步长。
我们看看在范围里第一个满足满足条件2的(此时t5=1):
20 (余数2,商3),那么此时要不要调整步长呢?答案是不用,让t5加1的条件是:商为余数的倍数!这个结论很容易得到。
那么看看第一个调整步长的数位多少,26(余数2,商4),此时程序要干下面几件事:
function(t2,t3+t5,t4,t5 + !((t3 / t2) % (t3 % t2)))
通俗来说就是 x = x + t5 (注意此时t5还是为1),然后t5 = t5 + 1,步长变为2。
即下一个function的参数为:function(6,27,0,2);
27也能使条件2成立,27(余数3,商4),但是却不能使步长加1,那么程序继续执行t3<t2*t2,然后function(6,27+2,0,2),你看 28就这样被跳过去了。
说的有些乱,希望你们能看明白。