單鏈表實現法雷序列

 法雷序列節點的定義

struct FareyListNode {
	int numerator; // 分子
	int denominator; // 分母
	FareyListNode *next;
	FareyListNode(int numerator, int denominator) {
		this->numerator = numerator;
		this->denominator = denominator;
		this->next = nullptr;
	}
};

法雷序列實現的函數

方法:不斷往後插入直至不能插入後頭指針後移

/*生成法雷序列,從inFile讀取n,輸出到outFile*/
void fareySubsequence(const char* inFileName, const char* outFileName) {
	std::ifstream fin(inFileName);
	int n;
	if (fin.is_open()) {
		fin >> n;
		fin.close();
	}
	std::ofstream fout(outFileName);
	if (fout.is_open()) {
		FareyListNode * farey = new FareyListNode(0, 1);
		// 初始化分子分母[0,1]/[1,1]
		farey->next = new FareyListNode(1, 1);
		FareyListNode * tempFarey = nullptr;
		// 生成法雷序列 
		long count = -1;
		while (farey->next != nullptr) {
			while (farey->denominator + farey->next->denominator <= n) {
				tempFarey = new FareyListNode(farey->numerator + farey->next->numerator,
					farey->denominator + farey->next->denominator);
				tempFarey->next = farey->next;
				farey->next = tempFarey;
				tempFarey = nullptr;
			}
			count++;
			fout << farey->numerator << '/' << farey->denominator << '\t';
			tempFarey = farey;
			farey = farey->next;
			delete tempFarey;
			tempFarey = nullptr;
		}
		fout << farey->numerator << '/' << farey->denominator << '\t';
		tempFarey = farey;
		farey = farey->next;
		delete tempFarey;
		tempFarey = nullptr;
		delete farey;
		farey = nullptr;
		fout << "總數 = " << count;
		fout.close();
	}
}

法雷節點調用的主函數(通過文件讀取)

const char* InFileNameFareySubsequence = "farey.txt";
const char* OutFileNameFareySubsequence = "fareyTest.txt";
int main() {
	clock_t startTime, endTime;
	startTime = clock();//計時開始
	fareySubsequence(InFileNameFareySubsequence, OutFileNameFareySubsequence);
	endTime = clock();//計時結束
	printf_s("The run time is: %f s", (double)(endTime - startTime) / CLOCKS_PER_SEC);
	system("pause");
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章