N级Farey分数的实现c++实现

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;
}

输出如下:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值