| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 540 人关注过本帖
标题:高手解一下这题
只看楼主 加入收藏
hamsters
Rank: 2
等 级:论坛游民
帖 子:33
专家分:54
注 册:2012-6-10
结帖率:100%
收藏
 问题点数:0 回复次数:6 
高手解一下这题
程序代码:
void _(int __, int ___, int ____, int _____)
{
    ((___ / __) <= _____) ? _(__,___+_____,____,_____) : !(___ % __) ? _(__,___+_____,___ % __, _____) :
    ((___ % __)==(___ / __) && !____) ? (printf("%dt",(___ / __)),
    _(__,___+_____,____,_____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ?
    _(__,___+_____,____,_____ + !((___ / __) % (___ % __))) : (___ < __ * __) ?
    _(__,___+_____,____,_____) : 0;
}

int main() {
    _(100,0,0,1);
} 

这是什么,解释一下

2012-06-15 23:00
简体字01
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:86
专家分:137
注 册:2012-3-4
收藏
得分:0 
#include<stdio.h>

void f(int a, int b, int c, int d)
{
    ((b / a) <= d) ? f(a,b+d,c,d) : !(b % a) ? f(a,b+d,b % a, d) :
    ((b % a)==(b / a) && !c) ? (printf("%dt",(b / a)),
    f(a,b+d,c,d)) : ((b % a) > d && (b % a) < (b / a)) ?
    f(a,b+d,c,d + !((b / a) % (b % a))) : (b < a * a) ?
    f(a,b+d,c,d) : 0;
}

int main() {
   f(100,0,0,1);
}


把下划线都换了,看着顺眼多了,,中间就一个运算符  ?  : 也就是if else ,作用我也没看明白、
2012-06-15 23:58
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:0 
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就这样被跳过去了。

说的有些乱,希望你们能看明白。
2012-06-16 01:05
逸枫
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:33
专家分:113
注 册:2012-6-10
收藏
得分:0 
这个我看着就眼花-.-楼上两位好厉害
2012-06-16 07:34
wwc386646959
Rank: 2
等 级:论坛游民
帖 子:29
专家分:82
注 册:2012-6-16
收藏
得分:0 
就是?:问题,这在c语言中很特别,唯一一个三元运算符
2012-06-16 21:32
ruanst110
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-6-6
收藏
得分:0 
    好,受用了
2012-06-17 08:08
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
为什么要搞这么奇怪的东西啊? 佩服。

梅尚程荀
马谭杨奚







                                                       
2012-06-17 10:32
快速回复:高手解一下这题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.028910 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved