趣味:c语言递归main函数打印hello字样

今天下午没课,正好想起一个比较蛋疼的事情可以做,就是玩c语言的main函数递归。
首先还是说一下我的编译环境,哪些用m$的c语言编译器的朋友可以忽略这个文章了,放心吧,正常情况下是编译不通过的。。。
我的gcc版本是4.2.1。
先贴上代码~

#include #define ____ int #define o double #define O(x) printf("%c",x) #define (x) 1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0 main(____ _) { o ;if(!)main(1);else if(6)return;else{=();O((____)(+0.5));main(+1);} }

跑出来就是一个不换行的Hello
哈哈,这个代码看着很恶心吧。好吧,让我给你翻译一下~如果我把上述代码的define还有一些变量整理一下,那就是这样的

#include int main(int argc) { int x; double ans; if(argc0) main(1); else{ x=argc; if(x==6) return; else{ ans=1.0+1199.0x/12.0-799.0xx/24.0+55.0xxx/12.0-5.0xxxx/24.0; printf("%c",(int)(ans+0.5)); main(x+1); } } }

现在看明白了么?
关键就是这句
ans=1.0+1199.0*x/12.0-799.0*x*x/24.0+55.0*x*x*x/12.0-5.0*x*x*x*x/24.0;
这个通项正是有穷数列72,101,108,108,111的通项。那么我是如何得到这个表达式的呢?
很简单,用多项式的拉格朗日插值公式就可以解决这个问题。
先把公式贴上来。

至于这个公式是怎么推导出来的,你可以看看这篇论文,讲解的很详细,这里就不复制过来了,哈哈
http://www.lw23.com/pdf_d659df85-fb38-47e6-ac02-147a12d2bab3/lunwen.pdf
有了这个通项就简单了,只要不断递归main函数,理论上可以答应出任意的函数出来。
ps:我求通项的时候用Mathematica来计算的,毕竟当数据多了,展开是个很麻烦的事情。。。然后又先用python写了个函数验证了通项正确后才改写成c的本身递归模式。囧

四个0求24

这个问题是个老问题了,网上应该很多人都解过了
不过,这几天又提起就写写吧~
第一次看到这个问题的时候我们刚刚在学习阶乘,很早的时候了。
所以,当时几乎大部分的人都想到

(0!+0!+0!+0!)!=24

后来,又想到一种算法是

(cos 0+cos 0+cos 0+cos 0)!=24

这两种都有一些变种
比如
a^b代表a的b次方

((0!+0!)^(0!+0!))!=24

((0!+0!)*(0!+0!))!=24

((cos 0!+cos 0!)^(cos 0!+cos 0!))!=24

((cos 0!+cos 0!)*(cos 0!+cos 0!))!=24

然后,今天我又想到可以利用位运算
就有了这种解法

((0!+0!)<<(0!*0!))!=24

变种的又有不少
比如

((0!+0!)<<(0!))!*0!=24

((0!+0!)<<(0!))!+0=24

当然,把上面的0!替换成cos 0也是一样的
当然还有很多变种可以推出来,最最关键的就是cos和阶乘运算让0“无中生有”,之后就有很多种处理方法了:)