Sep 20

M67的那篇文章在这:http://www.matrix67.com/blog/archives/1598
很久之前就转到自己博客上来了,在这里,当时也没细看,当然也没看明白。
今天仔细分析了下,终于明白怎么回事了。
先用字符串“I love you to death! You are the cutest and sweetest girl I've ever met.”生成程序为:

     #include      <stdio.h>
   main(t ,_,a)  char*a;{return
 t<1?main(*a,a[-t],"=a-1kj3gnm:q\
ebh_cf*<r.d>i^+?,()[?qzyrjuvcdefg\
h,!kbpolwxs'.t main(")&&a[-t]&&main
(t-1,_,a):t/2?_==*a?putchar(32[a])
  :_%115<36||main(t,_,a+1):main(
    0,t,")?r<g:?1<3?+<#?#m:}(\
      w+b_?1<}3?tt(yk:?+|b:\
        ?n3+:>+?([m?>.::+\
          :>+?e)kr?)ig{\
            :?y:~g:k?\
              ,:+^")
                ;}

是一个很漂亮的心形,用gcc编译执行输出:

i love you to death! you are the cutest and sweetest girl i've ever met.#

Apr 1

Romberge算法是什么,其实是一种求数值积分的方法。就是先不断二分用递推梯形公式求出Tn,再通过Tn,T2n的线性组合求出复化Simpon积分Sn,再通过Sn,S2n的线性组合求出Cotes积分值,这样一步步往下算,它是一种加速算法。过程像下面这样:

                                                                                   T1 
                                                                                   T2    S1
                                                                                   T4    S2    C1
                                                                                   T8    S4    C2    R1
                                                                                   T16  S8    C4    R2   ....
 
下面是用C语言实现的代码:

Mar 24

      最近突然冒出一个想法:怎样写一个程序,它可以输出自己的源代码?

      我们都写过这个程序:

#include<stdio.h>
main() { printf("Hello, world");}

      它会输出:

Hello, world

      于是很自然地,要写出一个输出自己的程序,可以尝试这样写:

#include<stdio.h>
main() { printf("#include<stdio.h>\nmain() { printf(\"#include<stdio.h>\n main() { ...\") } ");}

      它会输出:

#include<stdio.h>
main() { printf("#include<stdio.h>
main() { ..."
) }

      你可以继续这样写下去,但你会发现自己已经陷入死循环了,写到printf那就得返回去加上一段。显然像上面这样是做不到的。是不是说这样的程序就不存在呢?答案是否定的,不仅写得出来,而且各种各样,五花八门的都有。

Mar 17

qsort包含在<stdlib.h>头文件中,此函数根据你给的比较条件进行快速排序,通过指针移动实现排序。排序之后的结果仍然放在原数组中。使用qsort函数必须自己写一个比较函数。

函数原型:

void qsort (void  *base,size_t num,size_t size , int (* comparator)(const void * , const void  *));

用法以及参数说明:

Base数组起始地址
num数组元素个数
size每一个元素的大小
comparator函数指针,指向比较函数
1比较函数要接受两个参数,一般要转换成要比较数据的类型;
2比较函数的返回值要反映两个参数是大于,等于还是小于的关系,分别用一个正数,0和一个负数表示。
在比较函数中以第一个参数和第二个参数比较则是从小到大排序。反过来则是从大到小排序。看下面的例子:

对int类型数组排序
int num[100];

int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}

qsort(num,100,sizeof(num[0]),cmp);

Feb 23

关灯游戏是一个十分有趣的智力游戏 , 它的规则是:有h行l列的方格子(所谓的灯),游戏开始时有个初始状态,当你点击其中一盏灯,它和它的紧邻上下左右( 对于位于中间的灯,它的紧邻上下左右共有4盏灯,角上的灯的紧邻只有 2盏灯,边上非角上的灯的紧邻为3盏灯)的灯的状态将全部改变,原来是灭的灯变亮,原来亮的灯则变灭, 要求游戏玩家设法将全部的灯变成事先规定的终止状态。 
该游戏流行的玩法是:初始局面随机确定一些灯是亮的,另外的是灭的,按照上面的规则,要求玩家设法将全部的灯关掉。
这里有一个