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
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
Hint
Author
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
typedef struct list
{
int data1, data2;
struct list *next;
}nlist;
int main()
{
nlist *head, *last;
head=(nlist *)malloc(sizeof(nlist));
last=(nlist *)malloc(sizeof(nlist));
head->next=last;
head->data1=0;
head->data2=1;
last->next=NULL;
last->data1=1;
last->data2=1;
int n;
scanf("%d", &n);
int i=n;
n--;
nlist *mail=head;
while(n--)
{
mail=head;
while(mail->next)
{
if(mail->data2+mail->next->data2<=i)
{
nlist *p;
p=(nlist *)malloc(sizeof(nlist));
p->data1=mail->data1+mail->next->data1;
p->data2=mail->data2+mail->next->data2;
p->next=mail->next;
mail->next=p;
}
mail=mail->next;
}
}
mail=head;
int top=1;
int kk=0;
while(mail)
{
if(kk%10==0&&kk)printf("\n");
else if(top==1)top=0;
else printf("\t");
printf("%d/%d", mail->data1, mail->data2);
mail=mail->next;
kk++;
}
return 0;
}