Problem Description
Farey序列是一个这样的序列:其第一级序列定义为(0/1,1/1),这一序列扩展到第二级形成序列(0/1,1/2,1/1),扩展到第三极形成序列(0/1,1/3,1/2,2/3,1/1),扩展到第四级则形成序列(0/1,1/4,1/3,1/2,2/3,3/4,1/1)。以后在每一级n,如果上一级的任何两个相邻分数a/c与b/d满足(c+d)<=n,就将一个新的分数(a+b)/(c+d)插入在两个分数之间。对于给定的n值,依次输出其第n级序列所包含的每一个分数。
Input
Output
Example Input
6
Example Output
0/1 1/6 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/44/5 5/6 1/1
#include <iostream> #include<bits/stdc++.h> using namespace std; struct node { int data1; int data2; node *next; }; node *head,*tail,*p,*q; void chushihua(node *head) { p=new node; p->next=NULL; p->data1=0; p->data2=1; tail->next=p; tail=p; p=new node; p->next=NULL; p->data1=1; p->data2=1; tail->next=p; tail=p; } node * insert(node *head,int n) { p=head->next; tail=p->next; while(p) { if(tail==NULL) break; if((p->data2+tail->data2)<=n) { q=new node; q->data1=p->data1+tail->data1; q->data2=p->data2+tail->data2; q->next=p->next; p->next=q; tail=q; } else { p=p->next; tail=tail->next; } } return head; } void print(node *head) { int k=1; p=head->next; int count=0; while(p) { if(k) k=0; else cout<<"\t"; count++; // printf("%d/%d",p->data1,p->data2); cout<<p->data1<<"/"<<p->data2; p=p->next; if(count==10) { count=0; cout<<endl; k=1; } } if(count!=10) cout<<endl; } int main() { int n; while(cin>>n) { head=new node; head->next=NULL; tail=head; chushihua(head); if(n==1) print(head); else { insert(head,n); print(head); } } return 0; }