1. 程式人生 > >資料結構實驗之連結串列八:Farey序列

資料結構實驗之連結串列八:Farey序列

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

輸入一個整數n(0<n<=100)

Output

依次輸出第n級序列所包含的每一個分數,每行輸出10個分數,同一行的兩個相鄰分數間隔一個製表符的距離。

Sample Input

6

Sample Output

0/1   1/6   1/5   1/4   1/3   2/5   1/2   3/5   2/3   3/4
4/5   5/6   1/1

#include <stdio.h> #include <stdlib.h> typedef struct node {     int a;     int b;     struct node *next; }LNode;//a代表分子,b代表分母,一個分數為一個結點 void creat(LNode *l,int n) {     LNode *tail,*r,*p,*q;     tail=(LNode *)malloc(sizeof(LNode));     tail=l->next;//用它來確保每個分數之間都把該插入的插入進來,新插入的結點與原結點之間也可以判斷一下,是否可以插入新的     while(tail->next!=NULL)     {         p=tail;//從tail之後開始進行插入         q=p->next;         if(p->b+q->b<=n)         {             r=(LNode *)malloc(sizeof(LNode));             r->a=p->a+q->a;             r->b=p->b+q->b;             r->next=q;             p->next=r;         }//判斷條件,符合的話,插入到連結串列之中         tail=tail->next;     } } void display(LNode *l) {     LNode *p;     int num=0;     p=l->next;     while(p!=NULL)     {         num++;         if(num==10)         {             printf("%d/%d\n",p->a,p->b);             num=0;         }         else printf("%d/%d\t",p->a,p->b);//”\t“代表製表符的距離         p=p->next;     } } int main() {     int i,n;     scanf("%d",&n);     LNode *l,*p,*q;     l=(LNode *)malloc(sizeof(LNode));     p=(LNode *)malloc(sizeof(LNode));     q=(LNode *)malloc(sizeof(LNode));     p->a=0;p->b=1;     q->a=1;q->b=1;//建立頭尾結點     q->next=NULL;     l->next=p;     p->next=q;//把已知結點連線成連結串列     for(i=2;i<=n;i++)     {         creat(l,i);     }//分級一次進行連結串列的建立     display(l);//輸出連結串列     return 0; }