USACO上看到一个极妙的分数[0,1]排序。
algorithms
imported
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);
}
不用判断是否是既约分数也不用排序
如此神奇的方法令本弱菜仰慕不已~~