数据结构实验之链表八: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

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
#include
#include
using namespace std;

typedef struct Node{
    int top;
    int bottom;
    struct Node *next;
}node;

void create(node * &head){
    node *p,*tail;
    head = new Node;
    head->next = NULL;
    tail = head;
    p = new Node;
    p->bottom = 1;
    p->top = 0;
    tail->next = p;
    tail = p;
    p = new Node;
    p->bottom = 1;
    p->top = 1;
    tail->next = p;
    tail = p;
}

void handle(node * &head,int n){
    node *p,*q,*k;
    int i;
    for(i = 2; i <= n ;i++){
        p = head->next;
        q = p->next;
        while(q){
            if((p->bottom + q->bottom) <= i){
                k = new Node;
                k->top = p->top + q->top;
                k->bottom = p->bottom + q->bottom;
                k->next = NULL;
                k->next = p->next;
                p->next = k;
            }
            p = q;
            q = q->next;
        }
    }
}
void printf(node * &head){
    node *cur;
    cur = head->next;
    int count = 0;
    while(cur){
        count++;
        if(count % 10 == 0){
            printf("%d/%d\n",cur->top,cur->bottom);
        }else{
            printf("%d/%d\t",cur->top,cur->bottom);
        }
        cur = cur->next;
    }
}

int main(){
    int n;
    node *head;
    scanf("%d",&n);
    create(head);
    if(n == 1){
        printf(head);
    }else{
        handle(head,n);
        printf(head);
    }
    return 0;
}

原本pe了一发,将空格改为\t之后奏效

你可能感兴趣的:(数据结构实验之链表八:Farey序列)