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个分数,同一行的两个相邻分数间隔一个制表符的距离。
Example Input
6
Example 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
code:
#include<stdio.h> #include<stdlib.h> typedef struct node { struct node *next; int data1, data2; }Llist; void show(Llist *head); void creat(Llist *head, int n); int main() { int n; Llist *head, *p, *q; scanf("%d", &n); head = (Llist *)malloc(sizeof(Llist)); head->next = NULL; p = (Llist*)malloc(sizeof(Llist)); q = (Llist *)malloc(sizeof(Llist)); p->data1 = 0; p->data2 = 1; q->data1 = 1; q->data2 = 1; head->next = p; p->next = q; q->next = NULL; for(int i = 2;i<=n;i++) { creat(head, i); } show(head); } void creat(Llist *head, int n) { Llist *p, *q, *tail; tail = head->next; while(tail->next) { p = tail->next; if(p->data2 + tail->data2 <=n) { q = (Llist *)malloc(sizeof(Llist)); q->data1 = p->data1 + tail->data1; q->data2 = p->data2 + tail->data2; tail->next = q; q->next = p; } tail = tail -> next; } } void show(Llist *head) { int count = 0; Llist *p = head->next; while(p) { count++; if(!(count%10)) printf("%d/%d\n", p->data1, p->data2); else printf("%d/%d\t", p->data1, p->data2); p = p->next; } }