生成分母不大于N的Farey序列.
这是递归求法.
用扩展欧几里得定理可以求紧邻着的下一项,
公式 K1*L2 - K2*L1 = 1
但是目前还没有学习它...
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int n;
typedef struct node
{
int up,down;
double val;
}node;
bool cmp(node a, node b)
{
return a.val<b.val;
}
vector<node> v;
int gcd(int x,int y)
{
if(!x) return y;
if(x<y)
{
return gcd(y%x,x);
}
return gcd(x%y,y);
}
void build(int a, int b, int x, int y)
{
int p = a+x;
int q = b+y;
int tmp = gcd(p,q);//注意要化成最简
p /= tmp;
q /= tmp;
if(q<=n)
{
build(a,b,p,q);
v.push_back((node){p,q,(double)p/q});
build(p,q,x,y);
}
}
int main()
{
while(scanf("%d",&n)==1)
{
while(!v.empty()) v.pop_back();
v.push_back((node){0,1,0.0});
v.push_back((node){1,1,1.0});
build(0,1,1,1);
sort(v.begin(),v.end(),cmp);
for(vector<node>::iterator it = v.begin();it < v.end(); it++)
{
printf("%d/%d\n",it->up,it->down);
}
printf("\n");
}
}