N级Farey分数的实现
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级序列所包含的每一个分数。
// C.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<iostream>
using namespace std;
class Farey;//前置声明类
class Node {
public:
Node(int a1 = 0, int b1 = 1);
~Node() {}
friend class Farey;//方便Farey访问Node的私有成员
//友元函数 Farey和Node都要声明
friend ostream& operator<< (ostream&out, const Farey& obj);
private://私有成员数据
int a, b;
Node * next;
};
Node::Node(int a1,int b1) {// a/b
a = a1;//设置a
b = b1;//设置b
next = NULL;
}
class Farey {
public:
Node *head;
int n;
Farey();
Farey(int n);
~Farey();
friend ostream& operator<< (ostream&out,const Farey& obj);
private:
void init();
};
//默认构造函数 将n级数设置为1
Farey::Farey() {
n = 1;//默认的n设置为1
init();
}
//初始化函数(0/1,1/1)
void Farey::init() {
head = new Node(0, 0);
head->next = new Node(0, 1);
head->next->next = new Node(1, 1);
}
Farey::Farey(int n1) {
n = n1;//设置n的大小
init();//初始化Farey数
int a, b, c, d;
Node*p = NULL;
for (int i = 2; i <= n1; i++) {
p = head->next;//每次循环后记得要更新p的指向的位置
while (p->next != NULL) {
a = p->a;
c = p->b;
b = p->next->a;
d = p->next->b;
if (c + d <= i) {
Node *newNode = new Node(a + b, c + d);
newNode->next = p->next;
p->next = newNode;
}
p = p->next;
}
}
};//设置 关键 函数
Farey::~Farey() {
Node *pre = head, *p;
while (pre != NULL) {
p = pre->next;
delete pre;
pre = p;
}
}
ostream& operator<< (ostream& out,const Farey& obj) {//输出部分
Node *p = obj.head->next;
out << "(";//输出
while (p->next != NULL) {
out << p->a << "/" << p->b<<",";
p = p->next;
}
out << p->a<<"/"<<p->b<<")";
return out;
}
int main() {
Farey zjc3(3), zjc4(4), zjc5(5);
cout << zjc3 << endl << zjc4 << endl << zjc5 << endl;
return 0;
}