USACO上看到一个极妙的分数[0,1]排序。

algorithms
imported
Published

November 26, 2011

0/1                                                              1/1
                               1/2
                  1/3                      2/3
        1/4              2/5         3/5                 3/4
    1/5      2/7     3/8    3/7   4/7   5/8       5/7         4/5

很明显,中序遍历就可以完成排序。
函数如下
genfrac(int n1, int d1, int n2, int d2)
{
    if(d1+d2 > n)   /* cut off recursion */
        return;

    genfrac(n1,d1, n1+n2,d1+d2);
    fprintf(fout, "%d/%dn", n1+n2, d1+d2);
    genfrac(n1+n2,d1+d2, n2,d2);
}
不用判断是否是既约分数也不用排序
如此神奇的方法令本弱菜仰慕不已~~